From 7bd1af956e1946529aad0a4f9438d8adec873b7d Mon Sep 17 00:00:00 2001 From: Marc Valle <30421017+mav-intel@users.noreply.github.com> Date: Tue, 25 Jul 2017 15:41:32 -0700 Subject: [PATCH 01/10] Initial commit --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..d673eb5 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# epid-sdk +The Intel(R) Enhanced Privacy ID Software Development Kit -- GitLab From aad54d5c70b1b624da543d8b9da8c72a5267a2c0 Mon Sep 17 00:00:00 2001 From: "Marc A. Valle" Date: Tue, 25 Jul 2017 15:44:41 -0700 Subject: [PATCH 02/10] Release SDK 2.0.0 New in This Release: * 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 Changes: * The default hash algorithm has changed. It is now SHA-512. * Functions that returned `EpidNullPtrErr` now return `EpidBadArgErr` instead. Fixes: * Updated build flags to work around GCC 4.8.5 defect. Known Issues: * SHA-512/256 hash algorithm is not supported. * Compressed key sample material is not included in the package. --- LICENSE.txt | 249 + NOTICE.txt | 22 + README.md | 57 +- RELEASE_NOTES.md | 41 + SConstruct | 210 + doc/html/BuildingSdk.html | 150 + doc/html/ChangeLog.html | 106 + doc/html/EpidOverview.html | 172 + doc/html/Glossary.html | 170 + doc/html/ImplementationNotes.html | 110 + doc/html/IssuerMaterial.html | 136 + doc/html/LegalInformation.html | 84 + doc/html/SdkOverview.html | 163 + doc/html/SignVerifyTutorial.html | 192 + doc/html/annotated.html | 136 + doc/html/arrowdown.png | Bin 0 -> 246 bytes doc/html/arrowright.png | Bin 0 -> 229 bytes doc/html/basicdoc.png | Bin 0 -> 19922 bytes doc/html/bc_s.png | Bin 0 -> 676 bytes doc/html/bdwn.png | Bin 0 -> 147 bytes doc/html/bignum_8c.html | 120 + doc/html/bignum_8h.html | 124 + doc/html/bitsupplier_8h.html | 92 + doc/html/building__sdk_8dox.html | 82 + doc/html/check__privrl__entry_8c.html | 93 + doc/html/classes.html | 113 + doc/html/closed.png | Bin 0 -> 132 bytes doc/html/commitment_8c.html | 98 + doc/html/commitment_8h.html | 108 + doc/html/decompress__privkey_8c.html | 124 + .../dir_02c945662023679b89476bd7126bc985.html | 111 + .../dir_12b90d9c027aaf878a834df729679a56.html | 96 + .../dir_512d3e62841a8535b716ec4cf8b9e950.html | 123 + .../dir_f169ebf8da29290a918fa4b3f7151050.html | 132 + .../dir_f6bef457d5f671b6e774bfccc16651f6.html | 156 + doc/html/doc.png | Bin 0 -> 746 bytes doc/html/doxygen.css | 1475 ++ doc/html/doxygen.png | Bin 0 -> 3779 bytes doc/html/dynsections.js | 97 + doc/html/ecdsa_8h.html | 98 + doc/html/ecdsa__sign_8c.html | 105 + doc/html/ecdsa__verify_8c.html | 133 + doc/html/ecgroup_8c.html | 222 + doc/html/ecgroup_8h.html | 159 + doc/html/endian__convert_8h.html | 92 + doc/html/epid2params_8c.html | 98 + doc/html/epid2params_8h.html | 105 + doc/html/epid2params__ate_8inc.html | 82 + doc/html/epid__overview_8dox.html | 82 + .../epid_diagram_high_level_interaction.png | Bin 0 -> 25513 bytes doc/html/epid_diagram_high_level_use_case.png | Bin 0 -> 16041 bytes doc/html/epid_diagram_issuer_high_level.png | Bin 0 -> 4857 bytes doc/html/epid_diagram_member_high_level.png | Bin 0 -> 8319 bytes doc/html/epid_diagram_verifier_high_level.png | Bin 0 -> 8897 bytes doc/html/epidstyle.css | 325 + doc/html/errors_8c.html | 101 + doc/html/errors_8h.html | 122 + doc/html/examples.html | 82 + doc/html/examples.js | 5 + doc/html/examples_8dox.html | 82 + doc/html/file__parser_8c.html | 118 + doc/html/file__parser_8h.html | 141 + doc/html/files.html | 141 + doc/html/finitefield_8c.html | 162 + doc/html/finitefield_8h.html | 159 + doc/html/folderclosed.png | Bin 0 -> 616 bytes doc/html/folderopen.png | Bin 0 -> 597 bytes doc/html/functions.html | 98 + doc/html/functions_b.html | 107 + doc/html/functions_c.html | 85 + doc/html/functions_d.html | 90 + doc/html/functions_e.html | 112 + doc/html/functions_f.html | 100 + doc/html/functions_g.html | 122 + doc/html/functions_h.html | 98 + doc/html/functions_k.html | 95 + doc/html/functions_l.html | 79 + doc/html/functions_m.html | 82 + doc/html/functions_n.html | 102 + doc/html/functions_p.html | 105 + doc/html/functions_q.html | 80 + doc/html/functions_r.html | 121 + doc/html/functions_s.html | 113 + doc/html/functions_t.html | 99 + doc/html/functions_v.html | 88 + doc/html/functions_vars.html | 98 + doc/html/functions_vars_b.html | 107 + doc/html/functions_vars_c.html | 85 + doc/html/functions_vars_d.html | 90 + doc/html/functions_vars_e.html | 112 + doc/html/functions_vars_f.html | 100 + doc/html/functions_vars_g.html | 122 + doc/html/functions_vars_h.html | 98 + doc/html/functions_vars_k.html | 95 + doc/html/functions_vars_l.html | 79 + doc/html/functions_vars_m.html | 82 + doc/html/functions_vars_n.html | 102 + doc/html/functions_vars_p.html | 105 + doc/html/functions_vars_q.html | 80 + doc/html/functions_vars_r.html | 121 + doc/html/functions_vars_s.html | 113 + doc/html/functions_vars_t.html | 99 + doc/html/functions_vars_v.html | 88 + doc/html/functions_vars_w.html | 83 + doc/html/functions_vars_x.html | 95 + doc/html/functions_vars_y.html | 83 + doc/html/functions_w.html | 83 + doc/html/functions_x.html | 95 + doc/html/functions_y.html | 83 + doc/html/get__sigsize_8c.html | 93 + doc/html/globals.html | 80 + doc/html/globals_b.html | 119 + doc/html/globals_c.html | 104 + doc/html/globals_d.html | 120 + doc/html/globals_defs.html | 197 + doc/html/globals_e.html | 308 + doc/html/globals_enum.html | 86 + doc/html/globals_eval.html | 184 + doc/html/globals_f.html | 129 + doc/html/globals_func.html | 80 + doc/html/globals_func_b.html | 92 + doc/html/globals_func_c.html | 99 + doc/html/globals_func_d.html | 120 + doc/html/globals_func_e.html | 287 + doc/html/globals_func_f.html | 120 + doc/html/globals_func_i.html | 83 + doc/html/globals_func_m.html | 80 + doc/html/globals_func_n.html | 107 + doc/html/globals_func_o.html | 79 + doc/html/globals_func_p.html | 128 + doc/html/globals_func_r.html | 88 + doc/html/globals_func_s.html | 99 + doc/html/globals_func_w.html | 88 + doc/html/globals_g.html | 79 + doc/html/globals_h.html | 79 + doc/html/globals_i.html | 89 + doc/html/globals_k.html | 188 + doc/html/globals_m.html | 86 + doc/html/globals_n.html | 110 + doc/html/globals_o.html | 79 + doc/html/globals_p.html | 137 + doc/html/globals_r.html | 100 + doc/html/globals_s.html | 114 + doc/html/globals_t.html | 79 + doc/html/globals_type.html | 110 + doc/html/globals_vars.html | 78 + doc/html/globals_w.html | 91 + doc/html/glossary_8dox.html | 82 + doc/html/group___big_num_primitives.html | 445 + doc/html/group___big_num_primitives.js | 12 + doc/html/group___ec_group_primitives.html | 1078 + doc/html/group___ec_group_primitives.js | 23 + doc/html/group___ecdsa_primitives.html | 229 + doc/html/group___ecdsa_primitives.js | 5 + doc/html/group___epid_common.html | 1066 + doc/html/group___epid_common.js | 76 + doc/html/group___epid_math.html | 106 + doc/html/group___epid_math.js | 9 + doc/html/group___epid_member_module.html | 933 + doc/html/group___epid_member_module.js | 37 + doc/html/group___epid_module.html | 97 + doc/html/group___epid_module.js | 6 + doc/html/group___epid_print.html | 660 + doc/html/group___epid_print.js | 19 + doc/html/group___epid_types.html | 266 + doc/html/group___epid_types.js | 169 + doc/html/group___epid_verifier_module.html | 834 + doc/html/group___epid_verifier_module.js | 22 + doc/html/group___error_codes.html | 225 + doc/html/group___error_codes.js | 24 + doc/html/group___file_parser.html | 439 + doc/html/group___file_parser.js | 34 + doc/html/group___finite_field_primitives.html | 1048 + doc/html/group___finite_field_primitives.js | 23 + doc/html/group___hash_primitives.html | 142 + doc/html/group___hash_primitives.js | 7 + doc/html/group___pairing_primitives.html | 249 + doc/html/group___pairing_primitives.js | 7 + doc/html/grouppubkey_8c.html | 96 + doc/html/grouppubkey_8h.html | 104 + doc/html/hash_8h.html | 102 + doc/html/implementation__notes_8dox.html | 82 + doc/html/index.html | 78 + doc/html/issuer__material_8dox.html | 82 + doc/html/jquery.js | 68 + doc/html/legal__information_8dox.html | 82 + doc/html/mainpage_8dox.html | 82 + doc/html/member_2api_8h.html | 148 + doc/html/member_2context_8c.html | 129 + doc/html/member_2context_8h.html | 159 + doc/html/memory_8c.html | 118 + doc/html/memory_8h.html | 124 + doc/html/modules.html | 95 + doc/html/modules.js | 4 + doc/html/nav_f.png | Bin 0 -> 153 bytes doc/html/nav_g.png | Bin 0 -> 95 bytes doc/html/nav_h.png | Bin 0 -> 98 bytes doc/html/navtree.css | 143 + doc/html/navtree.js | 523 + doc/html/navtreedata.js | 91 + doc/html/navtreeindex0.js | 253 + doc/html/navtreeindex1.js | 203 + doc/html/nr__prove_8c.html | 132 + doc/html/nrverify_8c.html | 128 + doc/html/open.png | Bin 0 -> 123 bytes doc/html/organization_8dox.html | 82 + doc/html/pageorder_8dox.html | 84 + doc/html/pages.html | 89 + doc/html/pairing_8c.html | 205 + doc/html/pairing_8h.html | 109 + doc/html/presig_8c.html | 161 + doc/html/printutils_8c.html | 178 + doc/html/printutils_8h.html | 137 + doc/html/privkey_8c.html | 96 + doc/html/privkey_8h.html | 104 + doc/html/request__join_8c.html | 133 + doc/html/resize.js | 97 + doc/html/sdk__overview_8dox.html | 82 + doc/html/sdk_block_diagram.png | Bin 0 -> 9193 bytes doc/html/sha256_8c.html | 93 + doc/html/sign_8c.html | 97 + doc/html/sign__verify__tutorial_8dox.html | 82 + doc/html/signbasic_8c.html | 122 + doc/html/signmsg_8c-example.html | 77 + doc/html/sigrlvalid_8c.html | 94 + doc/html/sigrlvalid_8h.html | 94 + doc/html/sigs__linked_8c.html | 93 + doc/html/splitbar.png | Bin 0 -> 314 bytes doc/html/stack_8c.html | 113 + doc/html/stack_8h.html | 105 + doc/html/stdtypes_8h.html | 105 + doc/html/struct_allowed_basename.html | 105 + doc/html/struct_basic_signature.html | 126 + doc/html/struct_big_num_str.html | 97 + doc/html/struct_commit_values.html | 137 + doc/html/struct_compressed_priv_key.html | 107 + doc/html/struct_ecdsa_private_key.html | 97 + doc/html/struct_ecdsa_public_key.html | 101 + doc/html/struct_ecdsa_signature.html | 101 + doc/html/struct_epid2_params.html | 130 + doc/html/struct_epid2_params__.html | 153 + doc/html/struct_epid_ca_certificate.html | 130 + doc/html/struct_epid_file_header.html | 101 + ...struct_epid_group_pub_key_certificate.html | 115 + doc/html/struct_epid_signature.html | 111 + doc/html/struct_error_text_entry.html | 99 + doc/html/struct_fp_elem_str.html | 97 + doc/html/struct_fq12_elem_dat.html | 95 + doc/html/struct_fq12_elem_str.html | 97 + doc/html/struct_fq2_elem_dat.html | 95 + doc/html/struct_fq2_elem_str.html | 97 + doc/html/struct_fq6_elem_dat.html | 95 + doc/html/struct_fq6_elem_str.html | 97 + doc/html/struct_fq_elem_dat.html | 95 + doc/html/struct_fq_elem_str.html | 97 + doc/html/struct_g1_elem_str.html | 101 + doc/html/struct_g2_elem_str.html | 101 + doc/html/struct_group_pub_key.html | 111 + doc/html/struct_group_pub_key__.html | 109 + doc/html/struct_group_rl.html | 107 + doc/html/struct_gt_elem_str.html | 97 + doc/html/struct_i_priv_key.html | 102 + doc/html/struct_join_p_commit_values.html | 127 + doc/html/struct_join_request.html | 106 + doc/html/struct_member_ctx.html | 147 + doc/html/struct_member_precomp.html | 112 + doc/html/struct_membership_credential.html | 106 + doc/html/struct_nr_proof.html | 110 + doc/html/struct_nr_verify_commit_values.html | 133 + doc/html/struct_oct_str128.html | 97 + doc/html/struct_oct_str16.html | 97 + doc/html/struct_oct_str256.html | 97 + doc/html/struct_oct_str32.html | 97 + doc/html/struct_oct_str512.html | 97 + doc/html/struct_oct_str64.html | 97 + doc/html/struct_oct_str8.html | 97 + doc/html/struct_pre_computed_signature.html | 138 + doc/html/struct_priv_key.html | 111 + doc/html/struct_priv_key__.html | 109 + doc/html/struct_priv_rl.html | 111 + doc/html/struct_sha256_digest.html | 97 + doc/html/struct_sig_rl.html | 111 + doc/html/struct_sig_rl_entry.html | 101 + doc/html/struct_stack.html | 108 + doc/html/struct_verifier_ctx.html | 143 + doc/html/struct_verifier_precomp.html | 112 + doc/html/struct_verifier_rl.html | 111 + doc/html/sync_off.png | Bin 0 -> 853 bytes doc/html/sync_on.png | Bin 0 -> 845 bytes doc/html/tab_a.png | Bin 0 -> 142 bytes doc/html/tab_b.png | Bin 0 -> 169 bytes doc/html/tab_h.png | Bin 0 -> 177 bytes doc/html/tab_s.png | Bin 0 -> 184 bytes doc/html/tabs.css | 60 + doc/html/types_8h.html | 227 + doc/html/verifier_2api_8h.html | 138 + doc/html/verifier_2context_8c.html | 120 + doc/html/verifier_2context_8h.html | 96 + doc/html/verify_8c.html | 122 + doc/html/verifybasic_8c.html | 125 + doc/html/verifysig_8c-example.html | 77 + doc/index.html | 15 + .../bignum_wrapper-testhelper.cc | 123 + .../bignum_wrapper-testhelper.h | 69 + .../common-testhelper/common-testhelper.parts | 66 + .../ecgroup_wrapper-testhelper.cc | 126 + .../ecgroup_wrapper-testhelper.h | 68 + .../ecpoint_wrapper-testhelper.cc | 123 + .../ecpoint_wrapper-testhelper.h | 75 + .../epid_params-testhelper.cc | 164 + .../epid_params-testhelper.h | 72 + epid/common-testhelper/errors-testhelper.h | 41 + .../ffelement_wrapper-testhelper.cc | 141 + .../ffelement_wrapper-testhelper.h | 81 + .../finite_field_wrapper-testhelper.cc | 170 + .../finite_field_wrapper-testhelper.h | 68 + epid/common-testhelper/octstr-testhelper.cc | 126 + epid/common-testhelper/octstr-testhelper.h | 47 + epid/common-testhelper/prng-testhelper.h | 81 + .../unittests/bignum_wrapper-test.cc | 173 + .../unittests/ecgroup_wrapper-test.cc | 154 + .../unittests/ecpoint_wrapper-test.cc | 134 + .../unittests/ffelement_wrapper-test.cc | 156 + .../unittests/finite_field_wrapper-test.cc | 135 + epid/common-testhelper/unittests/main-test.cc | 26 + .../verifier_wrapper-testhelper.cc | 53 + .../verifier_wrapper-testhelper.h | 55 + epid/common/bitsupplier.h | 46 + epid/common/commitment.c | 121 + epid/common/commitment.h | 120 + epid/common/common.parts | 139 + epid/common/endian_convert.h | 38 + epid/common/epid2params.c | 575 + epid/common/epid2params.h | 75 + epid/common/epid2params_ate.inc | 111 + epid/common/errors.c | 65 + epid/common/errors.h | 71 + epid/common/file_parser.c | 269 + epid/common/file_parser.h | 241 + epid/common/grouppubkey.c | 86 + epid/common/grouppubkey.h | 67 + epid/common/math/bignum-internal.h | 60 + epid/common/math/bignum.c | 266 + epid/common/math/bignum.h | 156 + epid/common/math/ecdsa.h | 114 + epid/common/math/ecdsa_sign.c | 205 + epid/common/math/ecdsa_verify.c | 351 + epid/common/math/ecgroup-internal.h | 44 + epid/common/math/ecgroup.c | 945 + epid/common/math/ecgroup.h | 435 + epid/common/math/finitefield-internal.h | 46 + epid/common/math/finitefield.c | 805 + epid/common/math/finitefield.h | 403 + epid/common/math/hash.h | 63 + epid/common/math/pairing-internal.h | 39 + epid/common/math/pairing.c | 2381 ++ epid/common/math/pairing.h | 102 + epid/common/math/printutils.c | 604 + epid/common/math/printutils.h | 287 + epid/common/math/sha256.c | 43 + epid/common/math/unittests/bignum-test.cc | 394 + epid/common/math/unittests/ecdsa_sign-test.cc | 229 + .../math/unittests/ecdsa_verify-test.cc | 278 + epid/common/math/unittests/ecgroup-test.cc | 1690 ++ epid/common/math/unittests/ffelement-test.cc | 2543 ++ .../common/math/unittests/file_parser-test.cc | 1199 + .../common/math/unittests/finitefield-test.cc | 173 + epid/common/math/unittests/hash-test.cc | 87 + epid/common/math/unittests/main-test.cc | 26 + .../math/unittests/octstrconvert-test.cc | 72 + epid/common/math/unittests/pairing-test.cc | 225 + epid/common/math/unittests/printutils-test.cc | 379 + epid/common/memory.c | 122 + epid/common/memory.h | 123 + epid/common/sigrlvalid.c | 49 + epid/common/sigrlvalid.h | 46 + epid/common/stack.c | 91 + epid/common/stack.h | 95 + epid/common/stdtypes.h | 37 + epid/common/testdata/grp01/gpubkey.inc | 53 + .../grp01/member0/sig_test0_sha256_sigrl.inc | 1222 + .../grp01/member0/sig_test0_sha384_sigrl.inc | 1222 + .../grp01/member0/sig_test0_sha512_sigrl.inc | 1222 + .../testdata/grp01/member0/sig_test1.inc | 74 + .../member0/sig_test1_basename1_sha256.inc | 85 + .../grp01/member0/sig_test1_sha256.inc | 85 + .../grp01/member0/sig_test1_sha384.inc | 85 + .../grp01/member0/sig_test1_sha512.inc | 85 + epid/common/testdata/grp01/privrl.inc | 277 + epid/common/testdata/grp01/sigrl.inc | 878 + epid/common/testdata/grp01/verrl.inc | 151 + .../testdata/grp_x/cmember9/cmpprivkey.inc | 36 + .../testdata/grp_x/cmember9/mprivkey.inc | 44 + epid/common/testdata/grp_x/iprivkey.inc | 31 + .../testdata/grp_x/member0/mprivkey.inc | 44 + .../grp_x/member0/sig_sha256_bsn0_msg0.inc | 135 + .../sig_sha256_bsn0_msg0_rl_singleentry.inc | 95 + .../grp_x/member0/sig_sha256_bsn0_msg1.inc | 135 + .../grp_x/member0/sig_sha256_bsn1_msg0.inc | 135 + .../grp_x/member0/sig_sha256_rndbase_msg0.inc | 135 + .../grp_x/member0/sig_sha256_rndbase_msg1.inc | 135 + .../grp_x/member0/sig_sha384_bsn0_msg0.inc | 135 + .../grp_x/member0/sig_sha384_rndbase_msg0.inc | 135 + .../grp_x/member0/sig_sha512_bsn0_msg0.inc | 135 + .../grp_x/member0/sig_sha512_rndbase_msg0.inc | 135 + .../testdata/grp_x/member1/mprivkey.inc | 44 + .../grp_x/member1/sig_sha256_bsn0_msg0.inc | 136 + .../grp_x/privrevoked/mprivatekey000.inc | 45 + .../grp_x/privrevoked/mprivatekey001.inc | 45 + .../grp_x/privrevoked/mprivatekey002.inc | 45 + .../sig_sha256_bsn0_msg0_revkey000.inc | 135 + .../sig_sha256_bsn0_msg0_revkey001.inc | 135 + .../sig_sha256_bsn0_msg0_revkey002.inc | 135 + epid/common/testdata/grp_x/privrl.inc | 40 + .../privrl_single_entry_revoked_key000.inc | 33 + epid/common/testdata/grp_x/pubkey.inc | 59 + .../grp_x/sigrevoked/mprivatekey000.inc | 45 + .../grp_x/sigrevoked/mprivatekey001.inc | 45 + .../grp_x/sigrevoked/mprivatekey002.inc | 45 + epid/common/testdata/grp_x/sigrl.inc | 76 + ...g_sha256_bsn0_msg0_revoked_first_entry.inc | 77 + ...ig_sha256_bsn0_msg0_revoked_last_entry.inc | 77 + ..._sha256_bsn0_msg0_revoked_middle_entry.inc | 77 + .../testdata/grp_x/sigrl_single_entry.inc | 45 + epid/common/testdata/grp_x/sigrl_ver_2.inc | 76 + .../grp_x/verrevoked/bsn0/mprivkey000.inc | 45 + .../grp_x/verrevoked/bsn0/mprivkey001.inc | 45 + .../grp_x/verrevoked/bsn0/mprivkey002.inc | 45 + .../bsn0/sig_revoked0sha256bsn0msg0.inc | 136 + .../bsn0/sig_revoked1sha256bsn0msg0.inc | 135 + .../bsn0/sig_revoked2sha256bsn0msg0.inc | 135 + .../testdata/grp_x/verrevoked/bsn0/verrl.inc | 68 + .../grp_x/verrevoked/bsn0/verrl_1entry.inc | 50 + .../grp_x/verrevoked/bsn1/mprivkey003.inc | 45 + .../grp_x/verrevoked/bsn1/mprivkey004.inc | 45 + .../grp_x/verrevoked/bsn1/mprivkey005.inc | 45 + .../bsn1/sig_revoked3sha256bsn1msg0.inc | 135 + .../testdata/grp_x/verrevoked/bsn1/verrl.inc | 69 + .../verrevoked/bsn1/verrl_012revoked.inc | 68 + .../testdata/grp_y/cmember9/cmpprivkey.dat | Bin 0 -> 80 bytes .../testdata/grp_y/cmember9/cmpprivkey.inc | 36 + epid/common/testdata/grp_y/iprivkey.inc | 32 + epid/common/testdata/grp_y/pubkey.inc | 59 + epid/common/testdata/grprl.inc | 26 + .../grprl_revoked_grp_x_first_entry.inc | 31 + .../grprl_revoked_grp_x_last_entry.inc | 31 + .../grprl_revoked_grp_x_middle_entry.inc | 31 + .../grprl_single_entry_revoked_grp_x.inc | 27 + .../testdata/ikgf/groupa/member0/mprecomp.inc | 106 + .../testdata/ikgf/groupa/member0/mprivkey.inc | 36 + epid/common/testdata/ikgf/groupa/privrl.inc | 38 + epid/common/testdata/ikgf/groupa/pubkey.inc | 46 + .../ikgf/groupa/sig_msg0_sha256_sigrl.inc | 98 + .../ikgf/groupa/sig_sha256_bsn0_msg0.inc | 58 + .../groupa/sig_sha256_bsn0_msg0_revkey.inc | 61 + .../ikgf/groupa/sig_sha256_rndbase_msg0.inc | 98 + .../sig_sigrevoked_sha256_bsn0_msg0.inc | 98 + .../groupa/sig_test1_basename1_sha256.inc | 59 + .../groupa/sigrevokedmember0/mprivkey.inc | 36 + epid/common/testdata/ikgf/groupa/sigrl.inc | 57 + .../testdata/ikgf/groupb/member0/mprivkey.inc | 36 + .../sig_grouprevoked_sha256_bsn0_msg0.inc | 98 + epid/common/testdata/ikgf/grprl.inc | 124 + epid/common/types.h | 339 + epid/member/api.h | 482 + epid/member/context.c | 422 + epid/member/context.h | 85 + epid/member/decompress_privkey.c | 290 + epid/member/get_sigsize.c | 35 + epid/member/member.parts | 99 + epid/member/nr_prove.c | 288 + epid/member/presig.c | 229 + epid/member/privkey.c | 88 + epid/member/privkey.h | 67 + epid/member/request_join.c | 418 + epid/member/sign.c | 110 + epid/member/signbasic.c | 272 + epid/member/unittests/compute_presig-test.cc | 93 + epid/member/unittests/context-test.cc | 264 + .../unittests/decompress_privkey-test.cc | 97 + epid/member/unittests/get_sigsize-test.cc | 96 + epid/member/unittests/main-test.cc | 26 + epid/member/unittests/member-testhelper.cc | 522 + epid/member/unittests/member-testhelper.h | 116 + epid/member/unittests/nr_prove-test.cc | 299 + epid/member/unittests/presig-test.cc | 246 + epid/member/unittests/request_join-test.cc | 320 + epid/member/unittests/sign-test.cc | 1051 + epid/member/unittests/signbasic-test.cc | 401 + epid/verifier/api.h | 467 + epid/verifier/check_privrl_entry.c | 82 + epid/verifier/context.c | 466 + epid/verifier/context.h | 43 + epid/verifier/nrverify.c | 243 + epid/verifier/sigs_linked.c | 31 + .../unittests/check_privrl_entry-test.cc | 116 + epid/verifier/unittests/context-test.cc | 597 + epid/verifier/unittests/main-test.cc | 26 + epid/verifier/unittests/nrverify-test.cc | 265 + epid/verifier/unittests/sigs_linked-test.cc | 68 + .../testdata/sigrl/pub_key_sigrl_verify.inc | 39 + .../testdata/sigrl/signature_sigrl_first.inc | 54 + .../testdata/sigrl/signature_sigrl_last.inc | 54 + .../testdata/sigrl/signature_sigrl_middle.inc | 54 + .../testdata/sigrl/sigrl_five_entries.inc | 113 + .../testdata/sigrl/sigrl_single_entry.inc | 29 + .../verifier/unittests/verifier-testhelper.cc | 657 + epid/verifier/unittests/verifier-testhelper.h | 252 + epid/verifier/unittests/verify-test.cc | 1143 + epid/verifier/unittests/verifybasic-test.cc | 161 + epid/verifier/verifier.parts | 91 + epid/verifier/verify.c | 204 + epid/verifier/verifybasic.c | 323 + example/data/README.md | 161 + example/data/cacert.bin | Bin 0 -> 324 bytes example/data/data.parts | 70 + example/data/groupa/member0/mprivkey.dat | Bin 0 -> 144 bytes example/data/groupa/member1/mprivkey.dat | Bin 0 -> 144 bytes .../groupa/privrevokedmember0/mprivkey.dat | Bin 0 -> 144 bytes .../groupa/privrevokedmember1/mprivkey.dat | Bin 0 -> 144 bytes .../groupa/privrevokedmember2/mprivkey.dat | Bin 0 -> 144 bytes example/data/groupa/privrl.bin | Bin 0 -> 188 bytes example/data/groupa/pubkey.bin | Bin 0 -> 340 bytes .../groupa/sigrevokedmember0/mprivkey.dat | Bin 0 -> 144 bytes .../groupa/sigrevokedmember1/mprivkey.dat | Bin 0 -> 144 bytes .../groupa/sigrevokedmember2/mprivkey.dat | Bin 0 -> 144 bytes example/data/groupa/sigrl.bin | Bin 0 -> 476 bytes example/data/groupb/member0/mprivkey.dat | Bin 0 -> 144 bytes .../groupb/privrevokedmember0/mprivkey.dat | Bin 0 -> 144 bytes example/data/groupb/privrl.bin | Bin 0 -> 188 bytes example/data/groupb/pubkey.bin | Bin 0 -> 340 bytes .../groupb/sigrevokedmember0/mprivkey.dat | Bin 0 -> 144 bytes example/data/groupb/sigrl.bin | Bin 0 -> 476 bytes example/data/grprl.bin | Bin 0 -> 876 bytes example/data/grprl_empty.bin | Bin 0 -> 76 bytes example/data/mprivkey.dat | Bin 0 -> 144 bytes example/data/pubkey.bin | Bin 0 -> 340 bytes example/signmsg/signmsg.parts | 51 + example/signmsg/src/main.c | 385 + example/signmsg/src/prng.c | 98 + example/signmsg/src/prng.h | 36 + example/signmsg/src/signmsg.c | 171 + example/signmsg/src/signmsg.h | 42 + example/util/argutil.h | 52 + example/util/buffutil.h | 146 + example/util/convutil.h | 61 + example/util/envutil.h | 54 + example/util/src/argutil.c | 70 + example/util/src/bufutil.c | 355 + example/util/src/convutil.c | 75 + example/util/src/envutil.c | 91 + example/util/stdtypes.h | 37 + example/util/util.parts | 59 + example/verifysig/src/main.c | 418 + example/verifysig/src/verifysig.c | 233 + example/verifysig/src/verifysig.h | 41 + example/verifysig/verifysig.parts | 52 + ext/gtest/LICENSE | 28 + ext/gtest/gtest-all.cc | 9596 ++++++++ ext/gtest/gtest.h | 20061 ++++++++++++++++ ext/gtest/gtest.parts | 50 + ext/ipp/include/ippbase.h | 188 + ext/ipp/include/ippcp.h | 860 + ext/ipp/include/ippcpdefs.h | 371 + ext/ipp/include/ippcpepid.h | 218 + ext/ipp/include/ippdefs.h | 126 + ext/ipp/include/ipptypes.h | 1100 + ext/ipp/ippcommon.parts | 56 + ext/ipp/ippcp.parts | 82 + ext/ipp/ippcpepid.parts | 85 + ext/ipp/sources/include/owndefs.h | 934 + ext/ipp/sources/ippcp/src/owncp.h | 171 + ext/ipp/sources/ippcp/src/pcpbn.h | 203 + ext/ipp/sources/ippcp/src/pcpbnca.c | 1286 + ext/ipp/sources/ippcp/src/pcpbnresource.h | 48 + ext/ipp/sources/ippcp/src/pcpbnresourceca.c | 87 + ext/ipp/sources/ippcp/src/pcpbnsetca.c | 117 + ext/ipp/sources/ippcp/src/pcpbnu32arith.c | 366 + ext/ipp/sources/ippcp/src/pcpbnu32arith.h | 50 + ext/ipp/sources/ippcp/src/pcpbnu32misc.c | 229 + ext/ipp/sources/ippcp/src/pcpbnu32misc.h | 71 + ext/ipp/sources/ippcp/src/pcpbnuarith.c | 537 + ext/ipp/sources/ippcp/src/pcpbnuarith.h | 169 + ext/ipp/sources/ippcp/src/pcpbnuimpl.h | 136 + ext/ipp/sources/ippcp/src/pcpbnumisc.c | 294 + ext/ipp/sources/ippcp/src/pcpbnumisc.h | 160 + ext/ipp/sources/ippcp/src/pcpeccp.h | 260 + ext/ipp/sources/ippcp/src/pcpeccpdpca.c | 801 + ext/ipp/sources/ippcp/src/pcpeccpgenkeyca.c | 105 + ext/ipp/sources/ippcp/src/pcpeccpinitca.c | 454 + ext/ipp/sources/ippcp/src/pcpeccpmethod.h | 98 + ext/ipp/sources/ippcp/src/pcpeccpmethod128.h | 118 + .../sources/ippcp/src/pcpeccpmethod128ca.c | 879 + ext/ipp/sources/ippcp/src/pcpeccpmethod192.h | 117 + .../sources/ippcp/src/pcpeccpmethod192ca.c | 880 + ext/ipp/sources/ippcp/src/pcpeccpmethod224.h | 118 + .../sources/ippcp/src/pcpeccpmethod224ca.c | 877 + ext/ipp/sources/ippcp/src/pcpeccpmethod256.h | 118 + .../sources/ippcp/src/pcpeccpmethod256ca.c | 879 + ext/ipp/sources/ippcp/src/pcpeccpmethod384.h | 118 + .../sources/ippcp/src/pcpeccpmethod384ca.c | 879 + ext/ipp/sources/ippcp/src/pcpeccpmethod521.h | 118 + .../sources/ippcp/src/pcpeccpmethod521ca.c | 879 + ext/ipp/sources/ippcp/src/pcpeccpmethodcom.h | 133 + .../sources/ippcp/src/pcpeccpmethodcomca.c | 1025 + ext/ipp/sources/ippcp/src/pcpeccpmethodsm2.h | 120 + .../sources/ippcp/src/pcpeccpmethodsm2ca.c | 879 + ext/ipp/sources/ippcp/src/pcpeccppoint.h | 54 + ext/ipp/sources/ippcp/src/pcpeccppointca.c | 126 + ext/ipp/sources/ippcp/src/pcpeccppointopca.c | 482 + .../sources/ippcp/src/pcpeccppublickeyca.c | 87 + ext/ipp/sources/ippcp/src/pcpeccpsetkeyca.c | 102 + ext/ipp/sources/ippcp/src/pcpeccpsigndsaca.c | 146 + ext/ipp/sources/ippcp/src/pcpeccpsscm.c | 160 + ext/ipp/sources/ippcp/src/pcpeccpsscm.h | 45 + ext/ipp/sources/ippcp/src/pcpeccpstdca.c | 465 + .../sources/ippcp/src/pcpeccpverifydsaca.c | 173 + ext/ipp/sources/ippcp/src/pcphash.h | 239 + ext/ipp/sources/ippcp/src/pcphashcnt.c | 434 + ext/ipp/sources/ippcp/src/pcphashmd5px.c | 211 + ext/ipp/sources/ippcp/src/pcphashsha1px.c | 189 + ext/ipp/sources/ippcp/src/pcphashsha256px.c | 214 + ext/ipp/sources/ippcp/src/pcphashsha512px.c | 221 + ext/ipp/sources/ippcp/src/pcpmd5ca.c | 485 + ext/ipp/sources/ippcp/src/pcpmontexpbinca.c | 562 + ext/ipp/sources/ippcp/src/pcpmontgomery.h | 282 + ext/ipp/sources/ippcp/src/pcpmontgomeryca.c | 479 + ext/ipp/sources/ippcp/src/pcpmontred.c | 75 + ext/ipp/sources/ippcp/src/pcpmulbnukara.h | 84 + ext/ipp/sources/ippcp/src/pcppma.h | 106 + ext/ipp/sources/ippcp/src/pcppma128.c | 169 + ext/ipp/sources/ippcp/src/pcppma128.h | 79 + ext/ipp/sources/ippcp/src/pcppma192.c | 153 + ext/ipp/sources/ippcp/src/pcppma192.h | 84 + ext/ipp/sources/ippcp/src/pcppma224.c | 169 + ext/ipp/sources/ippcp/src/pcppma224.h | 81 + ext/ipp/sources/ippcp/src/pcppma256.c | 181 + ext/ipp/sources/ippcp/src/pcppma256.h | 82 + ext/ipp/sources/ippcp/src/pcppma384.c | 191 + ext/ipp/sources/ippcp/src/pcppma384.h | 82 + ext/ipp/sources/ippcp/src/pcppma521.c | 124 + ext/ipp/sources/ippcp/src/pcppma521.h | 80 + ext/ipp/sources/ippcp/src/pcppmasm2.c | 311 + ext/ipp/sources/ippcp/src/pcppmasm2.h | 121 + ext/ipp/sources/ippcp/src/pcpprimeg.h | 72 + ext/ipp/sources/ippcp/src/pcpprimeginitca.c | 158 + ext/ipp/sources/ippcp/src/pcpprng.h | 59 + ext/ipp/sources/ippcp/src/pcpprngenca.c | 251 + ext/ipp/sources/ippcp/src/pcpprnginitca.c | 111 + ext/ipp/sources/ippcp/src/pcpprngsetca.c | 239 + ext/ipp/sources/ippcp/src/pcpsha1ca.c | 551 + ext/ipp/sources/ippcp/src/pcpsha256ca.c | 728 + ext/ipp/sources/ippcp/src/pcpsha512ca.c | 674 + ext/ipp/sources/ippcp/src/pcptool.h | 631 + ext/ipp/sources/ippcp/src/pcpvariant.h | 326 + ext/ipp/sources/ippcp/src/precomp.h | 22 + ext/ipp/sources/ippcpepid/src/owncpepid.h | 52 + ext/ipp/sources/ippcpepid/src/pcpgfp.c | 846 + ext/ipp/sources/ippcpepid/src/pcpgfpec.c | 322 + ext/ipp/sources/ippcpepid/src/pcpgfpecpoint.c | 426 + .../ippcpepid/src/pcpgfpecpointstuff.c | 1227 + ext/ipp/sources/ippcpepid/src/pcpgfpecstuff.h | 320 + .../sources/ippcpepid/src/pcpgfphashstuff.h | 117 + ext/ipp/sources/ippcpepid/src/pcpgfpstuff.c | 486 + ext/ipp/sources/ippcpepid/src/pcpgfpstuff.h | 212 + ext/ipp/sources/ippcpepid/src/pcpgfpx.c | 202 + ext/ipp/sources/ippcpepid/src/pcpgfpxstuff.c | 1307 + ext/ipp/sources/ippcpepid/src/pcpgfpxstuff.h | 174 + parts-site/configurations/__init__.py | 25 + parts-site/configurations/debug/__init__.py | 20 + parts-site/configurations/debug/g++.py | 46 + parts-site/configurations/debug/gcc.py | 51 + .../configurations/debug/intelc_posix-any.py | 37 + .../debug/intelc_win32-any_win32-x86.py | 48 + .../debug/intelc_win32-any_win32-x86_64.py | 47 + .../debug/msvc_win32-any_win32-x86.py | 53 + .../debug/msvc_win32-any_win32-x86_64.py | 52 + parts-site/configurations/release/__init__.py | 19 + parts-site/configurations/release/g++.py | 46 + parts-site/configurations/release/gcc.py | 53 + .../release/intelc_posix-any.py | 38 + .../release/intelc_win32-any_win32-x86.py | 52 + .../release/intelc_win32-any_win32-x86_64.py | 51 + .../release/msvc_win32-any_win32-x86.py | 57 + .../release/msvc_win32-any_win32-x86_64.py | 56 + 685 files changed, 147985 insertions(+), 1 deletion(-) create mode 100644 LICENSE.txt create mode 100644 NOTICE.txt create mode 100644 RELEASE_NOTES.md create mode 100644 SConstruct create mode 100644 doc/html/BuildingSdk.html create mode 100644 doc/html/ChangeLog.html create mode 100644 doc/html/EpidOverview.html create mode 100644 doc/html/Glossary.html create mode 100644 doc/html/ImplementationNotes.html create mode 100644 doc/html/IssuerMaterial.html create mode 100644 doc/html/LegalInformation.html create mode 100644 doc/html/SdkOverview.html create mode 100644 doc/html/SignVerifyTutorial.html create mode 100644 doc/html/annotated.html create mode 100644 doc/html/arrowdown.png create mode 100644 doc/html/arrowright.png create mode 100644 doc/html/basicdoc.png create mode 100644 doc/html/bc_s.png create mode 100644 doc/html/bdwn.png create mode 100644 doc/html/bignum_8c.html create mode 100644 doc/html/bignum_8h.html create mode 100644 doc/html/bitsupplier_8h.html create mode 100644 doc/html/building__sdk_8dox.html create mode 100644 doc/html/check__privrl__entry_8c.html create mode 100644 doc/html/classes.html create mode 100644 doc/html/closed.png create mode 100644 doc/html/commitment_8c.html create mode 100644 doc/html/commitment_8h.html create mode 100644 doc/html/decompress__privkey_8c.html create mode 100644 doc/html/dir_02c945662023679b89476bd7126bc985.html create mode 100644 doc/html/dir_12b90d9c027aaf878a834df729679a56.html create mode 100644 doc/html/dir_512d3e62841a8535b716ec4cf8b9e950.html create mode 100644 doc/html/dir_f169ebf8da29290a918fa4b3f7151050.html create mode 100644 doc/html/dir_f6bef457d5f671b6e774bfccc16651f6.html create mode 100644 doc/html/doc.png create mode 100644 doc/html/doxygen.css create mode 100644 doc/html/doxygen.png create mode 100644 doc/html/dynsections.js create mode 100644 doc/html/ecdsa_8h.html create mode 100644 doc/html/ecdsa__sign_8c.html create mode 100644 doc/html/ecdsa__verify_8c.html create mode 100644 doc/html/ecgroup_8c.html create mode 100644 doc/html/ecgroup_8h.html create mode 100644 doc/html/endian__convert_8h.html create mode 100644 doc/html/epid2params_8c.html create mode 100644 doc/html/epid2params_8h.html create mode 100644 doc/html/epid2params__ate_8inc.html create mode 100644 doc/html/epid__overview_8dox.html create mode 100644 doc/html/epid_diagram_high_level_interaction.png create mode 100644 doc/html/epid_diagram_high_level_use_case.png create mode 100644 doc/html/epid_diagram_issuer_high_level.png create mode 100644 doc/html/epid_diagram_member_high_level.png create mode 100644 doc/html/epid_diagram_verifier_high_level.png create mode 100644 doc/html/epidstyle.css create mode 100644 doc/html/errors_8c.html create mode 100644 doc/html/errors_8h.html create mode 100644 doc/html/examples.html create mode 100644 doc/html/examples.js create mode 100644 doc/html/examples_8dox.html create mode 100644 doc/html/file__parser_8c.html create mode 100644 doc/html/file__parser_8h.html create mode 100644 doc/html/files.html create mode 100644 doc/html/finitefield_8c.html create mode 100644 doc/html/finitefield_8h.html create mode 100644 doc/html/folderclosed.png create mode 100644 doc/html/folderopen.png create mode 100644 doc/html/functions.html create mode 100644 doc/html/functions_b.html create mode 100644 doc/html/functions_c.html create mode 100644 doc/html/functions_d.html create mode 100644 doc/html/functions_e.html create mode 100644 doc/html/functions_f.html create mode 100644 doc/html/functions_g.html create mode 100644 doc/html/functions_h.html create mode 100644 doc/html/functions_k.html create mode 100644 doc/html/functions_l.html create mode 100644 doc/html/functions_m.html create mode 100644 doc/html/functions_n.html create mode 100644 doc/html/functions_p.html create mode 100644 doc/html/functions_q.html create mode 100644 doc/html/functions_r.html create mode 100644 doc/html/functions_s.html create mode 100644 doc/html/functions_t.html create mode 100644 doc/html/functions_v.html create mode 100644 doc/html/functions_vars.html create mode 100644 doc/html/functions_vars_b.html create mode 100644 doc/html/functions_vars_c.html create mode 100644 doc/html/functions_vars_d.html create mode 100644 doc/html/functions_vars_e.html create mode 100644 doc/html/functions_vars_f.html create mode 100644 doc/html/functions_vars_g.html create mode 100644 doc/html/functions_vars_h.html create mode 100644 doc/html/functions_vars_k.html create mode 100644 doc/html/functions_vars_l.html create mode 100644 doc/html/functions_vars_m.html create mode 100644 doc/html/functions_vars_n.html create mode 100644 doc/html/functions_vars_p.html create mode 100644 doc/html/functions_vars_q.html create mode 100644 doc/html/functions_vars_r.html create mode 100644 doc/html/functions_vars_s.html create mode 100644 doc/html/functions_vars_t.html create mode 100644 doc/html/functions_vars_v.html create mode 100644 doc/html/functions_vars_w.html create mode 100644 doc/html/functions_vars_x.html create mode 100644 doc/html/functions_vars_y.html create mode 100644 doc/html/functions_w.html create mode 100644 doc/html/functions_x.html create mode 100644 doc/html/functions_y.html create mode 100644 doc/html/get__sigsize_8c.html create mode 100644 doc/html/globals.html create mode 100644 doc/html/globals_b.html create mode 100644 doc/html/globals_c.html create mode 100644 doc/html/globals_d.html create mode 100644 doc/html/globals_defs.html create mode 100644 doc/html/globals_e.html create mode 100644 doc/html/globals_enum.html create mode 100644 doc/html/globals_eval.html create mode 100644 doc/html/globals_f.html create mode 100644 doc/html/globals_func.html create mode 100644 doc/html/globals_func_b.html create mode 100644 doc/html/globals_func_c.html create mode 100644 doc/html/globals_func_d.html create mode 100644 doc/html/globals_func_e.html create mode 100644 doc/html/globals_func_f.html create mode 100644 doc/html/globals_func_i.html create mode 100644 doc/html/globals_func_m.html create mode 100644 doc/html/globals_func_n.html create mode 100644 doc/html/globals_func_o.html create mode 100644 doc/html/globals_func_p.html create mode 100644 doc/html/globals_func_r.html create mode 100644 doc/html/globals_func_s.html create mode 100644 doc/html/globals_func_w.html create mode 100644 doc/html/globals_g.html create mode 100644 doc/html/globals_h.html create mode 100644 doc/html/globals_i.html create mode 100644 doc/html/globals_k.html create mode 100644 doc/html/globals_m.html create mode 100644 doc/html/globals_n.html create mode 100644 doc/html/globals_o.html create mode 100644 doc/html/globals_p.html create mode 100644 doc/html/globals_r.html create mode 100644 doc/html/globals_s.html create mode 100644 doc/html/globals_t.html create mode 100644 doc/html/globals_type.html create mode 100644 doc/html/globals_vars.html create mode 100644 doc/html/globals_w.html create mode 100644 doc/html/glossary_8dox.html create mode 100644 doc/html/group___big_num_primitives.html create mode 100644 doc/html/group___big_num_primitives.js create mode 100644 doc/html/group___ec_group_primitives.html create mode 100644 doc/html/group___ec_group_primitives.js create mode 100644 doc/html/group___ecdsa_primitives.html create mode 100644 doc/html/group___ecdsa_primitives.js create mode 100644 doc/html/group___epid_common.html create mode 100644 doc/html/group___epid_common.js create mode 100644 doc/html/group___epid_math.html create mode 100644 doc/html/group___epid_math.js create mode 100644 doc/html/group___epid_member_module.html create mode 100644 doc/html/group___epid_member_module.js create mode 100644 doc/html/group___epid_module.html create mode 100644 doc/html/group___epid_module.js create mode 100644 doc/html/group___epid_print.html create mode 100644 doc/html/group___epid_print.js create mode 100644 doc/html/group___epid_types.html create mode 100644 doc/html/group___epid_types.js create mode 100644 doc/html/group___epid_verifier_module.html create mode 100644 doc/html/group___epid_verifier_module.js create mode 100644 doc/html/group___error_codes.html create mode 100644 doc/html/group___error_codes.js create mode 100644 doc/html/group___file_parser.html create mode 100644 doc/html/group___file_parser.js create mode 100644 doc/html/group___finite_field_primitives.html create mode 100644 doc/html/group___finite_field_primitives.js create mode 100644 doc/html/group___hash_primitives.html create mode 100644 doc/html/group___hash_primitives.js create mode 100644 doc/html/group___pairing_primitives.html create mode 100644 doc/html/group___pairing_primitives.js create mode 100644 doc/html/grouppubkey_8c.html create mode 100644 doc/html/grouppubkey_8h.html create mode 100644 doc/html/hash_8h.html create mode 100644 doc/html/implementation__notes_8dox.html create mode 100644 doc/html/index.html create mode 100644 doc/html/issuer__material_8dox.html create mode 100644 doc/html/jquery.js create mode 100644 doc/html/legal__information_8dox.html create mode 100644 doc/html/mainpage_8dox.html create mode 100644 doc/html/member_2api_8h.html create mode 100644 doc/html/member_2context_8c.html create mode 100644 doc/html/member_2context_8h.html create mode 100644 doc/html/memory_8c.html create mode 100644 doc/html/memory_8h.html create mode 100644 doc/html/modules.html create mode 100644 doc/html/modules.js create mode 100644 doc/html/nav_f.png create mode 100644 doc/html/nav_g.png create mode 100644 doc/html/nav_h.png create mode 100644 doc/html/navtree.css create mode 100644 doc/html/navtree.js create mode 100644 doc/html/navtreedata.js create mode 100644 doc/html/navtreeindex0.js create mode 100644 doc/html/navtreeindex1.js create mode 100644 doc/html/nr__prove_8c.html create mode 100644 doc/html/nrverify_8c.html create mode 100644 doc/html/open.png create mode 100644 doc/html/organization_8dox.html create mode 100644 doc/html/pageorder_8dox.html create mode 100644 doc/html/pages.html create mode 100644 doc/html/pairing_8c.html create mode 100644 doc/html/pairing_8h.html create mode 100644 doc/html/presig_8c.html create mode 100644 doc/html/printutils_8c.html create mode 100644 doc/html/printutils_8h.html create mode 100644 doc/html/privkey_8c.html create mode 100644 doc/html/privkey_8h.html create mode 100644 doc/html/request__join_8c.html create mode 100644 doc/html/resize.js create mode 100644 doc/html/sdk__overview_8dox.html create mode 100644 doc/html/sdk_block_diagram.png create mode 100644 doc/html/sha256_8c.html create mode 100644 doc/html/sign_8c.html create mode 100644 doc/html/sign__verify__tutorial_8dox.html create mode 100644 doc/html/signbasic_8c.html create mode 100644 doc/html/signmsg_8c-example.html create mode 100644 doc/html/sigrlvalid_8c.html create mode 100644 doc/html/sigrlvalid_8h.html create mode 100644 doc/html/sigs__linked_8c.html create mode 100644 doc/html/splitbar.png create mode 100644 doc/html/stack_8c.html create mode 100644 doc/html/stack_8h.html create mode 100644 doc/html/stdtypes_8h.html create mode 100644 doc/html/struct_allowed_basename.html create mode 100644 doc/html/struct_basic_signature.html create mode 100644 doc/html/struct_big_num_str.html create mode 100644 doc/html/struct_commit_values.html create mode 100644 doc/html/struct_compressed_priv_key.html create mode 100644 doc/html/struct_ecdsa_private_key.html create mode 100644 doc/html/struct_ecdsa_public_key.html create mode 100644 doc/html/struct_ecdsa_signature.html create mode 100644 doc/html/struct_epid2_params.html create mode 100644 doc/html/struct_epid2_params__.html create mode 100644 doc/html/struct_epid_ca_certificate.html create mode 100644 doc/html/struct_epid_file_header.html create mode 100644 doc/html/struct_epid_group_pub_key_certificate.html create mode 100644 doc/html/struct_epid_signature.html create mode 100644 doc/html/struct_error_text_entry.html create mode 100644 doc/html/struct_fp_elem_str.html create mode 100644 doc/html/struct_fq12_elem_dat.html create mode 100644 doc/html/struct_fq12_elem_str.html create mode 100644 doc/html/struct_fq2_elem_dat.html create mode 100644 doc/html/struct_fq2_elem_str.html create mode 100644 doc/html/struct_fq6_elem_dat.html create mode 100644 doc/html/struct_fq6_elem_str.html create mode 100644 doc/html/struct_fq_elem_dat.html create mode 100644 doc/html/struct_fq_elem_str.html create mode 100644 doc/html/struct_g1_elem_str.html create mode 100644 doc/html/struct_g2_elem_str.html create mode 100644 doc/html/struct_group_pub_key.html create mode 100644 doc/html/struct_group_pub_key__.html create mode 100644 doc/html/struct_group_rl.html create mode 100644 doc/html/struct_gt_elem_str.html create mode 100644 doc/html/struct_i_priv_key.html create mode 100644 doc/html/struct_join_p_commit_values.html create mode 100644 doc/html/struct_join_request.html create mode 100644 doc/html/struct_member_ctx.html create mode 100644 doc/html/struct_member_precomp.html create mode 100644 doc/html/struct_membership_credential.html create mode 100644 doc/html/struct_nr_proof.html create mode 100644 doc/html/struct_nr_verify_commit_values.html create mode 100644 doc/html/struct_oct_str128.html create mode 100644 doc/html/struct_oct_str16.html create mode 100644 doc/html/struct_oct_str256.html create mode 100644 doc/html/struct_oct_str32.html create mode 100644 doc/html/struct_oct_str512.html create mode 100644 doc/html/struct_oct_str64.html create mode 100644 doc/html/struct_oct_str8.html create mode 100644 doc/html/struct_pre_computed_signature.html create mode 100644 doc/html/struct_priv_key.html create mode 100644 doc/html/struct_priv_key__.html create mode 100644 doc/html/struct_priv_rl.html create mode 100644 doc/html/struct_sha256_digest.html create mode 100644 doc/html/struct_sig_rl.html create mode 100644 doc/html/struct_sig_rl_entry.html create mode 100644 doc/html/struct_stack.html create mode 100644 doc/html/struct_verifier_ctx.html create mode 100644 doc/html/struct_verifier_precomp.html create mode 100644 doc/html/struct_verifier_rl.html create mode 100644 doc/html/sync_off.png create mode 100644 doc/html/sync_on.png create mode 100644 doc/html/tab_a.png create mode 100644 doc/html/tab_b.png create mode 100644 doc/html/tab_h.png create mode 100644 doc/html/tab_s.png create mode 100644 doc/html/tabs.css create mode 100644 doc/html/types_8h.html create mode 100644 doc/html/verifier_2api_8h.html create mode 100644 doc/html/verifier_2context_8c.html create mode 100644 doc/html/verifier_2context_8h.html create mode 100644 doc/html/verify_8c.html create mode 100644 doc/html/verifybasic_8c.html create mode 100644 doc/html/verifysig_8c-example.html create mode 100644 doc/index.html create mode 100644 epid/common-testhelper/bignum_wrapper-testhelper.cc create mode 100644 epid/common-testhelper/bignum_wrapper-testhelper.h create mode 100644 epid/common-testhelper/common-testhelper.parts create mode 100644 epid/common-testhelper/ecgroup_wrapper-testhelper.cc create mode 100644 epid/common-testhelper/ecgroup_wrapper-testhelper.h create mode 100644 epid/common-testhelper/ecpoint_wrapper-testhelper.cc create mode 100644 epid/common-testhelper/ecpoint_wrapper-testhelper.h create mode 100644 epid/common-testhelper/epid_params-testhelper.cc create mode 100644 epid/common-testhelper/epid_params-testhelper.h create mode 100644 epid/common-testhelper/errors-testhelper.h create mode 100644 epid/common-testhelper/ffelement_wrapper-testhelper.cc create mode 100644 epid/common-testhelper/ffelement_wrapper-testhelper.h create mode 100644 epid/common-testhelper/finite_field_wrapper-testhelper.cc create mode 100644 epid/common-testhelper/finite_field_wrapper-testhelper.h create mode 100644 epid/common-testhelper/octstr-testhelper.cc create mode 100644 epid/common-testhelper/octstr-testhelper.h create mode 100644 epid/common-testhelper/prng-testhelper.h create mode 100644 epid/common-testhelper/unittests/bignum_wrapper-test.cc create mode 100644 epid/common-testhelper/unittests/ecgroup_wrapper-test.cc create mode 100644 epid/common-testhelper/unittests/ecpoint_wrapper-test.cc create mode 100644 epid/common-testhelper/unittests/ffelement_wrapper-test.cc create mode 100644 epid/common-testhelper/unittests/finite_field_wrapper-test.cc create mode 100644 epid/common-testhelper/unittests/main-test.cc create mode 100644 epid/common-testhelper/verifier_wrapper-testhelper.cc create mode 100644 epid/common-testhelper/verifier_wrapper-testhelper.h create mode 100644 epid/common/bitsupplier.h create mode 100644 epid/common/commitment.c create mode 100644 epid/common/commitment.h create mode 100644 epid/common/common.parts create mode 100644 epid/common/endian_convert.h create mode 100644 epid/common/epid2params.c create mode 100644 epid/common/epid2params.h create mode 100644 epid/common/epid2params_ate.inc create mode 100644 epid/common/errors.c create mode 100644 epid/common/errors.h create mode 100644 epid/common/file_parser.c create mode 100644 epid/common/file_parser.h create mode 100644 epid/common/grouppubkey.c create mode 100644 epid/common/grouppubkey.h create mode 100644 epid/common/math/bignum-internal.h create mode 100644 epid/common/math/bignum.c create mode 100644 epid/common/math/bignum.h create mode 100644 epid/common/math/ecdsa.h create mode 100644 epid/common/math/ecdsa_sign.c create mode 100644 epid/common/math/ecdsa_verify.c create mode 100644 epid/common/math/ecgroup-internal.h create mode 100644 epid/common/math/ecgroup.c create mode 100644 epid/common/math/ecgroup.h create mode 100644 epid/common/math/finitefield-internal.h create mode 100644 epid/common/math/finitefield.c create mode 100644 epid/common/math/finitefield.h create mode 100644 epid/common/math/hash.h create mode 100644 epid/common/math/pairing-internal.h create mode 100644 epid/common/math/pairing.c create mode 100644 epid/common/math/pairing.h create mode 100644 epid/common/math/printutils.c create mode 100644 epid/common/math/printutils.h create mode 100644 epid/common/math/sha256.c create mode 100644 epid/common/math/unittests/bignum-test.cc create mode 100644 epid/common/math/unittests/ecdsa_sign-test.cc create mode 100644 epid/common/math/unittests/ecdsa_verify-test.cc create mode 100644 epid/common/math/unittests/ecgroup-test.cc create mode 100644 epid/common/math/unittests/ffelement-test.cc create mode 100644 epid/common/math/unittests/file_parser-test.cc create mode 100644 epid/common/math/unittests/finitefield-test.cc create mode 100644 epid/common/math/unittests/hash-test.cc create mode 100644 epid/common/math/unittests/main-test.cc create mode 100644 epid/common/math/unittests/octstrconvert-test.cc create mode 100644 epid/common/math/unittests/pairing-test.cc create mode 100644 epid/common/math/unittests/printutils-test.cc create mode 100644 epid/common/memory.c create mode 100644 epid/common/memory.h create mode 100644 epid/common/sigrlvalid.c create mode 100644 epid/common/sigrlvalid.h create mode 100644 epid/common/stack.c create mode 100644 epid/common/stack.h create mode 100644 epid/common/stdtypes.h create mode 100644 epid/common/testdata/grp01/gpubkey.inc create mode 100644 epid/common/testdata/grp01/member0/sig_test0_sha256_sigrl.inc create mode 100644 epid/common/testdata/grp01/member0/sig_test0_sha384_sigrl.inc create mode 100644 epid/common/testdata/grp01/member0/sig_test0_sha512_sigrl.inc create mode 100644 epid/common/testdata/grp01/member0/sig_test1.inc create mode 100644 epid/common/testdata/grp01/member0/sig_test1_basename1_sha256.inc create mode 100644 epid/common/testdata/grp01/member0/sig_test1_sha256.inc create mode 100644 epid/common/testdata/grp01/member0/sig_test1_sha384.inc create mode 100644 epid/common/testdata/grp01/member0/sig_test1_sha512.inc create mode 100644 epid/common/testdata/grp01/privrl.inc create mode 100644 epid/common/testdata/grp01/sigrl.inc create mode 100644 epid/common/testdata/grp01/verrl.inc create mode 100644 epid/common/testdata/grp_x/cmember9/cmpprivkey.inc create mode 100644 epid/common/testdata/grp_x/cmember9/mprivkey.inc create mode 100644 epid/common/testdata/grp_x/iprivkey.inc create mode 100644 epid/common/testdata/grp_x/member0/mprivkey.inc create mode 100644 epid/common/testdata/grp_x/member0/sig_sha256_bsn0_msg0.inc create mode 100644 epid/common/testdata/grp_x/member0/sig_sha256_bsn0_msg0_rl_singleentry.inc create mode 100644 epid/common/testdata/grp_x/member0/sig_sha256_bsn0_msg1.inc create mode 100644 epid/common/testdata/grp_x/member0/sig_sha256_bsn1_msg0.inc create mode 100644 epid/common/testdata/grp_x/member0/sig_sha256_rndbase_msg0.inc create mode 100644 epid/common/testdata/grp_x/member0/sig_sha256_rndbase_msg1.inc create mode 100644 epid/common/testdata/grp_x/member0/sig_sha384_bsn0_msg0.inc create mode 100644 epid/common/testdata/grp_x/member0/sig_sha384_rndbase_msg0.inc create mode 100644 epid/common/testdata/grp_x/member0/sig_sha512_bsn0_msg0.inc create mode 100644 epid/common/testdata/grp_x/member0/sig_sha512_rndbase_msg0.inc create mode 100644 epid/common/testdata/grp_x/member1/mprivkey.inc create mode 100644 epid/common/testdata/grp_x/member1/sig_sha256_bsn0_msg0.inc create mode 100644 epid/common/testdata/grp_x/privrevoked/mprivatekey000.inc create mode 100644 epid/common/testdata/grp_x/privrevoked/mprivatekey001.inc create mode 100644 epid/common/testdata/grp_x/privrevoked/mprivatekey002.inc create mode 100644 epid/common/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey000.inc create mode 100644 epid/common/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey001.inc create mode 100644 epid/common/testdata/grp_x/privrevoked/signatures/sig_sha256_bsn0_msg0_revkey002.inc create mode 100644 epid/common/testdata/grp_x/privrl.inc create mode 100644 epid/common/testdata/grp_x/privrl_single_entry_revoked_key000.inc create mode 100644 epid/common/testdata/grp_x/pubkey.inc create mode 100644 epid/common/testdata/grp_x/sigrevoked/mprivatekey000.inc create mode 100644 epid/common/testdata/grp_x/sigrevoked/mprivatekey001.inc create mode 100644 epid/common/testdata/grp_x/sigrevoked/mprivatekey002.inc create mode 100644 epid/common/testdata/grp_x/sigrl.inc create mode 100644 epid/common/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_first_entry.inc create mode 100644 epid/common/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_last_entry.inc create mode 100644 epid/common/testdata/grp_x/sigrl_member0_sig_sha256_bsn0_msg0_revoked_middle_entry.inc create mode 100644 epid/common/testdata/grp_x/sigrl_single_entry.inc create mode 100644 epid/common/testdata/grp_x/sigrl_ver_2.inc create mode 100644 epid/common/testdata/grp_x/verrevoked/bsn0/mprivkey000.inc create mode 100644 epid/common/testdata/grp_x/verrevoked/bsn0/mprivkey001.inc create mode 100644 epid/common/testdata/grp_x/verrevoked/bsn0/mprivkey002.inc create mode 100644 epid/common/testdata/grp_x/verrevoked/bsn0/sig_revoked0sha256bsn0msg0.inc create mode 100644 epid/common/testdata/grp_x/verrevoked/bsn0/sig_revoked1sha256bsn0msg0.inc create mode 100644 epid/common/testdata/grp_x/verrevoked/bsn0/sig_revoked2sha256bsn0msg0.inc create mode 100644 epid/common/testdata/grp_x/verrevoked/bsn0/verrl.inc create mode 100644 epid/common/testdata/grp_x/verrevoked/bsn0/verrl_1entry.inc create mode 100644 epid/common/testdata/grp_x/verrevoked/bsn1/mprivkey003.inc create mode 100644 epid/common/testdata/grp_x/verrevoked/bsn1/mprivkey004.inc create mode 100644 epid/common/testdata/grp_x/verrevoked/bsn1/mprivkey005.inc create mode 100644 epid/common/testdata/grp_x/verrevoked/bsn1/sig_revoked3sha256bsn1msg0.inc create mode 100644 epid/common/testdata/grp_x/verrevoked/bsn1/verrl.inc create mode 100644 epid/common/testdata/grp_x/verrevoked/bsn1/verrl_012revoked.inc create mode 100644 epid/common/testdata/grp_y/cmember9/cmpprivkey.dat create mode 100644 epid/common/testdata/grp_y/cmember9/cmpprivkey.inc create mode 100644 epid/common/testdata/grp_y/iprivkey.inc create mode 100644 epid/common/testdata/grp_y/pubkey.inc create mode 100644 epid/common/testdata/grprl.inc create mode 100644 epid/common/testdata/grprl_revoked_grp_x_first_entry.inc create mode 100644 epid/common/testdata/grprl_revoked_grp_x_last_entry.inc create mode 100644 epid/common/testdata/grprl_revoked_grp_x_middle_entry.inc create mode 100644 epid/common/testdata/grprl_single_entry_revoked_grp_x.inc create mode 100644 epid/common/testdata/ikgf/groupa/member0/mprecomp.inc create mode 100644 epid/common/testdata/ikgf/groupa/member0/mprivkey.inc create mode 100644 epid/common/testdata/ikgf/groupa/privrl.inc create mode 100644 epid/common/testdata/ikgf/groupa/pubkey.inc create mode 100644 epid/common/testdata/ikgf/groupa/sig_msg0_sha256_sigrl.inc create mode 100644 epid/common/testdata/ikgf/groupa/sig_sha256_bsn0_msg0.inc create mode 100644 epid/common/testdata/ikgf/groupa/sig_sha256_bsn0_msg0_revkey.inc create mode 100644 epid/common/testdata/ikgf/groupa/sig_sha256_rndbase_msg0.inc create mode 100644 epid/common/testdata/ikgf/groupa/sig_sigrevoked_sha256_bsn0_msg0.inc create mode 100644 epid/common/testdata/ikgf/groupa/sig_test1_basename1_sha256.inc create mode 100644 epid/common/testdata/ikgf/groupa/sigrevokedmember0/mprivkey.inc create mode 100644 epid/common/testdata/ikgf/groupa/sigrl.inc create mode 100644 epid/common/testdata/ikgf/groupb/member0/mprivkey.inc create mode 100644 epid/common/testdata/ikgf/groupb/sig_grouprevoked_sha256_bsn0_msg0.inc create mode 100644 epid/common/testdata/ikgf/grprl.inc create mode 100644 epid/common/types.h create mode 100644 epid/member/api.h create mode 100644 epid/member/context.c create mode 100644 epid/member/context.h create mode 100644 epid/member/decompress_privkey.c create mode 100644 epid/member/get_sigsize.c create mode 100644 epid/member/member.parts create mode 100644 epid/member/nr_prove.c create mode 100644 epid/member/presig.c create mode 100644 epid/member/privkey.c create mode 100644 epid/member/privkey.h create mode 100644 epid/member/request_join.c create mode 100644 epid/member/sign.c create mode 100644 epid/member/signbasic.c create mode 100644 epid/member/unittests/compute_presig-test.cc create mode 100644 epid/member/unittests/context-test.cc create mode 100644 epid/member/unittests/decompress_privkey-test.cc create mode 100644 epid/member/unittests/get_sigsize-test.cc create mode 100644 epid/member/unittests/main-test.cc create mode 100644 epid/member/unittests/member-testhelper.cc create mode 100644 epid/member/unittests/member-testhelper.h create mode 100644 epid/member/unittests/nr_prove-test.cc create mode 100644 epid/member/unittests/presig-test.cc create mode 100644 epid/member/unittests/request_join-test.cc create mode 100644 epid/member/unittests/sign-test.cc create mode 100644 epid/member/unittests/signbasic-test.cc create mode 100644 epid/verifier/api.h create mode 100644 epid/verifier/check_privrl_entry.c create mode 100644 epid/verifier/context.c create mode 100644 epid/verifier/context.h create mode 100644 epid/verifier/nrverify.c create mode 100644 epid/verifier/sigs_linked.c create mode 100644 epid/verifier/unittests/check_privrl_entry-test.cc create mode 100644 epid/verifier/unittests/context-test.cc create mode 100644 epid/verifier/unittests/main-test.cc create mode 100644 epid/verifier/unittests/nrverify-test.cc create mode 100644 epid/verifier/unittests/sigs_linked-test.cc create mode 100644 epid/verifier/unittests/testdata/sigrl/pub_key_sigrl_verify.inc create mode 100644 epid/verifier/unittests/testdata/sigrl/signature_sigrl_first.inc create mode 100644 epid/verifier/unittests/testdata/sigrl/signature_sigrl_last.inc create mode 100644 epid/verifier/unittests/testdata/sigrl/signature_sigrl_middle.inc create mode 100644 epid/verifier/unittests/testdata/sigrl/sigrl_five_entries.inc create mode 100644 epid/verifier/unittests/testdata/sigrl/sigrl_single_entry.inc create mode 100644 epid/verifier/unittests/verifier-testhelper.cc create mode 100644 epid/verifier/unittests/verifier-testhelper.h create mode 100644 epid/verifier/unittests/verify-test.cc create mode 100644 epid/verifier/unittests/verifybasic-test.cc create mode 100644 epid/verifier/verifier.parts create mode 100644 epid/verifier/verify.c create mode 100644 epid/verifier/verifybasic.c create mode 100644 example/data/README.md create mode 100644 example/data/cacert.bin create mode 100644 example/data/data.parts create mode 100644 example/data/groupa/member0/mprivkey.dat create mode 100644 example/data/groupa/member1/mprivkey.dat create mode 100644 example/data/groupa/privrevokedmember0/mprivkey.dat create mode 100644 example/data/groupa/privrevokedmember1/mprivkey.dat create mode 100644 example/data/groupa/privrevokedmember2/mprivkey.dat create mode 100644 example/data/groupa/privrl.bin create mode 100644 example/data/groupa/pubkey.bin create mode 100644 example/data/groupa/sigrevokedmember0/mprivkey.dat create mode 100644 example/data/groupa/sigrevokedmember1/mprivkey.dat create mode 100644 example/data/groupa/sigrevokedmember2/mprivkey.dat create mode 100644 example/data/groupa/sigrl.bin create mode 100644 example/data/groupb/member0/mprivkey.dat create mode 100644 example/data/groupb/privrevokedmember0/mprivkey.dat create mode 100644 example/data/groupb/privrl.bin create mode 100644 example/data/groupb/pubkey.bin create mode 100644 example/data/groupb/sigrevokedmember0/mprivkey.dat create mode 100644 example/data/groupb/sigrl.bin create mode 100644 example/data/grprl.bin create mode 100644 example/data/grprl_empty.bin create mode 100644 example/data/mprivkey.dat create mode 100644 example/data/pubkey.bin create mode 100644 example/signmsg/signmsg.parts create mode 100644 example/signmsg/src/main.c create mode 100644 example/signmsg/src/prng.c create mode 100644 example/signmsg/src/prng.h create mode 100644 example/signmsg/src/signmsg.c create mode 100644 example/signmsg/src/signmsg.h create mode 100644 example/util/argutil.h create mode 100644 example/util/buffutil.h create mode 100644 example/util/convutil.h create mode 100644 example/util/envutil.h create mode 100644 example/util/src/argutil.c create mode 100644 example/util/src/bufutil.c create mode 100644 example/util/src/convutil.c create mode 100644 example/util/src/envutil.c create mode 100644 example/util/stdtypes.h create mode 100644 example/util/util.parts create mode 100644 example/verifysig/src/main.c create mode 100644 example/verifysig/src/verifysig.c create mode 100644 example/verifysig/src/verifysig.h create mode 100644 example/verifysig/verifysig.parts create mode 100644 ext/gtest/LICENSE create mode 100644 ext/gtest/gtest-all.cc create mode 100644 ext/gtest/gtest.h create mode 100644 ext/gtest/gtest.parts create mode 100644 ext/ipp/include/ippbase.h create mode 100644 ext/ipp/include/ippcp.h create mode 100644 ext/ipp/include/ippcpdefs.h create mode 100644 ext/ipp/include/ippcpepid.h create mode 100644 ext/ipp/include/ippdefs.h create mode 100644 ext/ipp/include/ipptypes.h create mode 100644 ext/ipp/ippcommon.parts create mode 100644 ext/ipp/ippcp.parts create mode 100644 ext/ipp/ippcpepid.parts create mode 100644 ext/ipp/sources/include/owndefs.h create mode 100644 ext/ipp/sources/ippcp/src/owncp.h create mode 100644 ext/ipp/sources/ippcp/src/pcpbn.h create mode 100644 ext/ipp/sources/ippcp/src/pcpbnca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpbnresource.h create mode 100644 ext/ipp/sources/ippcp/src/pcpbnresourceca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpbnsetca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpbnu32arith.c create mode 100644 ext/ipp/sources/ippcp/src/pcpbnu32arith.h create mode 100644 ext/ipp/sources/ippcp/src/pcpbnu32misc.c create mode 100644 ext/ipp/sources/ippcp/src/pcpbnu32misc.h create mode 100644 ext/ipp/sources/ippcp/src/pcpbnuarith.c create mode 100644 ext/ipp/sources/ippcp/src/pcpbnuarith.h create mode 100644 ext/ipp/sources/ippcp/src/pcpbnuimpl.h create mode 100644 ext/ipp/sources/ippcp/src/pcpbnumisc.c create mode 100644 ext/ipp/sources/ippcp/src/pcpbnumisc.h create mode 100644 ext/ipp/sources/ippcp/src/pcpeccp.h create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpdpca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpgenkeyca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpinitca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethod.h create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethod128.h create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethod128ca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethod192.h create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethod192ca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethod224.h create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethod224ca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethod256.h create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethod256ca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethod384.h create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethod384ca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethod521.h create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethod521ca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethodcom.h create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethodcomca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethodsm2.h create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpmethodsm2ca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccppoint.h create mode 100644 ext/ipp/sources/ippcp/src/pcpeccppointca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccppointopca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccppublickeyca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpsetkeyca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpsigndsaca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpsscm.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpsscm.h create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpstdca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpeccpverifydsaca.c create mode 100644 ext/ipp/sources/ippcp/src/pcphash.h create mode 100644 ext/ipp/sources/ippcp/src/pcphashcnt.c create mode 100644 ext/ipp/sources/ippcp/src/pcphashmd5px.c create mode 100644 ext/ipp/sources/ippcp/src/pcphashsha1px.c create mode 100644 ext/ipp/sources/ippcp/src/pcphashsha256px.c create mode 100644 ext/ipp/sources/ippcp/src/pcphashsha512px.c create mode 100644 ext/ipp/sources/ippcp/src/pcpmd5ca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpmontexpbinca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpmontgomery.h create mode 100644 ext/ipp/sources/ippcp/src/pcpmontgomeryca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpmontred.c create mode 100644 ext/ipp/sources/ippcp/src/pcpmulbnukara.h create mode 100644 ext/ipp/sources/ippcp/src/pcppma.h create mode 100644 ext/ipp/sources/ippcp/src/pcppma128.c create mode 100644 ext/ipp/sources/ippcp/src/pcppma128.h create mode 100644 ext/ipp/sources/ippcp/src/pcppma192.c create mode 100644 ext/ipp/sources/ippcp/src/pcppma192.h create mode 100644 ext/ipp/sources/ippcp/src/pcppma224.c create mode 100644 ext/ipp/sources/ippcp/src/pcppma224.h create mode 100644 ext/ipp/sources/ippcp/src/pcppma256.c create mode 100644 ext/ipp/sources/ippcp/src/pcppma256.h create mode 100644 ext/ipp/sources/ippcp/src/pcppma384.c create mode 100644 ext/ipp/sources/ippcp/src/pcppma384.h create mode 100644 ext/ipp/sources/ippcp/src/pcppma521.c create mode 100644 ext/ipp/sources/ippcp/src/pcppma521.h create mode 100644 ext/ipp/sources/ippcp/src/pcppmasm2.c create mode 100644 ext/ipp/sources/ippcp/src/pcppmasm2.h create mode 100644 ext/ipp/sources/ippcp/src/pcpprimeg.h create mode 100644 ext/ipp/sources/ippcp/src/pcpprimeginitca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpprng.h create mode 100644 ext/ipp/sources/ippcp/src/pcpprngenca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpprnginitca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpprngsetca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpsha1ca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpsha256ca.c create mode 100644 ext/ipp/sources/ippcp/src/pcpsha512ca.c create mode 100644 ext/ipp/sources/ippcp/src/pcptool.h create mode 100644 ext/ipp/sources/ippcp/src/pcpvariant.h create mode 100644 ext/ipp/sources/ippcp/src/precomp.h create mode 100644 ext/ipp/sources/ippcpepid/src/owncpepid.h create mode 100644 ext/ipp/sources/ippcpepid/src/pcpgfp.c create mode 100644 ext/ipp/sources/ippcpepid/src/pcpgfpec.c create mode 100644 ext/ipp/sources/ippcpepid/src/pcpgfpecpoint.c create mode 100644 ext/ipp/sources/ippcpepid/src/pcpgfpecpointstuff.c create mode 100644 ext/ipp/sources/ippcpepid/src/pcpgfpecstuff.h create mode 100644 ext/ipp/sources/ippcpepid/src/pcpgfphashstuff.h create mode 100644 ext/ipp/sources/ippcpepid/src/pcpgfpstuff.c create mode 100644 ext/ipp/sources/ippcpepid/src/pcpgfpstuff.h create mode 100644 ext/ipp/sources/ippcpepid/src/pcpgfpx.c create mode 100644 ext/ipp/sources/ippcpepid/src/pcpgfpxstuff.c create mode 100644 ext/ipp/sources/ippcpepid/src/pcpgfpxstuff.h create mode 100644 parts-site/configurations/__init__.py create mode 100644 parts-site/configurations/debug/__init__.py create mode 100644 parts-site/configurations/debug/g++.py create mode 100644 parts-site/configurations/debug/gcc.py create mode 100644 parts-site/configurations/debug/intelc_posix-any.py create mode 100644 parts-site/configurations/debug/intelc_win32-any_win32-x86.py create mode 100644 parts-site/configurations/debug/intelc_win32-any_win32-x86_64.py create mode 100644 parts-site/configurations/debug/msvc_win32-any_win32-x86.py create mode 100644 parts-site/configurations/debug/msvc_win32-any_win32-x86_64.py create mode 100644 parts-site/configurations/release/__init__.py create mode 100644 parts-site/configurations/release/g++.py create mode 100644 parts-site/configurations/release/gcc.py create mode 100644 parts-site/configurations/release/intelc_posix-any.py create mode 100644 parts-site/configurations/release/intelc_win32-any_win32-x86.py create mode 100644 parts-site/configurations/release/intelc_win32-any_win32-x86_64.py create mode 100644 parts-site/configurations/release/msvc_win32-any_win32-x86.py create mode 100644 parts-site/configurations/release/msvc_win32-any_win32-x86_64.py diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..38f89e4 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,249 @@ + 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. + + +======================================================================= + +EPID SDK Subcomponents: + +The 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 EPID SDK bundles portions of the following under the BSD 3-Clause +License: + + - Google Test (https://github.com/google/googletest) + 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/NOTICE.txt b/NOTICE.txt new file mode 100644 index 0000000..fc0c420 --- /dev/null +++ b/NOTICE.txt @@ -0,0 +1,22 @@ +Intel(R) EPID SDK +Copyright 2016 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 the Intel(R) IPP Cryptography library (v9.0.3) 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 index d673eb5..332f722 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,57 @@ -# epid-sdk +# 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 + + +## Release Notes + +See [RELEASE_NOTES.md](RELEASE_NOTES.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 (v9.0.3) 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/RELEASE_NOTES.md b/RELEASE_NOTES.md new file mode 100644 index 0000000..3eb9ab3 --- /dev/null +++ b/RELEASE_NOTES.md @@ -0,0 +1,41 @@ +# Intel(R) EPID SDK Release Notes {#ChangeLog} + +# 2.0.0 + +## New in This Release + +* 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 + + +## Changes + +* The default hash algorithm has changed. It is now SHA-512. + +* Functions that returned `EpidNullPtrErr` now return `EpidBadArgErr` + instead. + + +## Fixes + +* Updated build flags to work around GCC 4.8.5 defect. + + +## Known Issues + +* SHA-512/256 hash algorithm is not supported. + +* Compressed key sample material is not included in the package. diff --git a/SConstruct b/SConstruct new file mode 100644 index 0000000..296adce --- /dev/null +++ b/SConstruct @@ -0,0 +1,210 @@ +############################################################################ +# 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. +############################################################################ + +"""use scons -k to invoke all builds regardless of unit test failures +""" +import string +import sys +import SCons.Script +import os.path +from parts import * + +print "**************** TOOLS ****************" +print '* Python Version:', string.split(sys.version, " ", 1)[0] +print '* SCons Version:', SCons.__version__ +print '* Parts Version:', PartsExtensionVersion() +print "***************************************" + +def PrintCompilerVersion(env): + """ + Function to print version of compilers used for build + Args: + env: Environment to get compilers version + """ + res = '' + if 'INTELC_VERSION' in env: + res += 'ICC ' + env['INTELC_VERSION'] + ';' + if 'MSVC_VERSION' in env: + res += 'MS ' + env['MSVC_VERSION'] + ';' + if 'GXX_VERSION' in env: + res += 'GXX ' + env['GXX_VERSION'] + ';' + if 'GCC_VERSION' in env: + res += 'GCC ' + env['GCC_VERSION'] + ';' + print 'Compiler Version: ', res + +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', + 'ext/ipp/ippcpepid.parts', + 'ext/ipp/ippcommon.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 = ['example/verifysig/verifysig.parts', + 'example/signmsg/signmsg.parts', + 'example/data/data.parts'] +example_test_parts = ['test/testbot/testbot.parts', + 'test/testbot/signmsg/signmsg_testbot.parts', + 'test/testbot/verifysig/verifysig_testbot.parts', + 'test/testbot/integration/integration_testbot.parts'] +package_parts = ['ext/gtest/gtest.parts', + 'ext/ipp/ippcommon.parts', + 'ext/ipp/ippcp.parts', + 'ext/ipp/ippcpepid.parts', + 'package.parts'] +internal_tools_parts = ['tools/ikgfwrapper/ikgfwrapper.parts', + 'tools/revokegrp/revokegrp.parts', + 'tools/revokekey/revokekey.parts', + 'tools/revokesig/revokesig.parts', + 'tools/extractkeys/extractkeys.parts', + 'tools/extractgrps/extractgrps.parts'] +######## End Part groups ############################################### +######## Commandline option setup ####################################### +product_variants = [ + 'production', + 'internal-test', + 'package-epid-sdk', + 'internal-tools' +] + +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 variant_dirname(): + s = GetOption("product-variant") + if s == 'production': + return 'epid-sdk' + elif s == 'package-epid-sdk': + 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) + +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 set_default_production_options(): + SetOptionDefault('TARGET_PLATFORM', 'x86_64') + 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('PACKAGE_DIR', + '#_package') + + SetOptionDefault('PACKAGE_ROOT', + '#_package/${PRODUCT_VARIANT}') + + SetOptionDefault('ROOT', + '#') + + SetOptionDefault('PACKAGE_NAME', + '{PRODUCT_VARIANT}') + +if is_production(): + set_default_production_options() + include_parts(ipp_parts, mode=['install_lib'], + INSTALL_INCLUDE='${INSTALL_IPP_INCLUDE}') + include_parts(utest_parts + common_parts + + member_parts + verifier_parts, + mode=['install_lib'], + 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}') + PrintCompilerVersion(DefaultEnvironment()) + Default('all') + Default('run_utest::') + +if is_internal_test(): + set_default_production_options() + include_parts(ipp_parts) + include_parts(utest_parts + common_parts + + member_parts + verifier_parts) + include_parts(util_parts + example_parts, + INSTALL_BIN='${INSTALL_SAMPLE_BIN}', + INSTALL_DATA='${INSTALL_SAMPLE_DATA}') + include_parts(example_test_parts) + Default('all') + +if is_internal_tools(): + set_default_production_options() + include_parts(ipp_parts + utest_parts + common_parts + util_parts) + include_parts(internal_tools_parts, INSTALL_BIN='${INSTALL_TOOLS_BIN}') + Default('ikgfwrapper', 'revokegrp', 'revokekey', 'revokesig', + 'extractkeys', 'extractgrps') + +if is_package(): + set_default_production_options() + include_parts(package_parts, + mode=['install_package'], + INSTALL_TOP_LEVEL='${PACKAGE_ROOT}') + Default('package') diff --git a/doc/html/BuildingSdk.html b/doc/html/BuildingSdk.html new file mode 100644 index 0000000..715303c --- /dev/null +++ b/doc/html/BuildingSdk.html @@ -0,0 +1,150 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Building From Source + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
Building From Source
+
+
+ +

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.

+

+Prerequisites

+

Building SDK code out of the box requires a number of tools. This section lists the tools used to build the SDK.

+ + + + + + + + + + + +
Prerequisite Notes
A C/C++ compiler Core code in C. Unit tests need C++11 support.
Python Validated with v2.7.10
SCons Validated with v2.4.1
Parts 0.10.9.2 or later
+

+Building

+

To use the SDK, you need to build it to generate libraries compatible with your build environment.

+

To build based on the default SConstruct file in the root directory of the SDK, invoke scons with no arguments.

cd <path/to/sdk-root>
+scons
+

By default, this performs a 64 bit release build.

+

Potentially useful command line options:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Option Action
--cfg=debug Build in debug mode
--cfg=release Build in release mode
--target=x86 Target x86
--target=x86_64 Target x86_64
--tc=cl Use msvc to compile
--tc=gcc Use gcc to compile
--tc=icl,mstools Use intelc to compile
build:: Build the SDK (does not build unit tests)
utest:: Build unit tests
run_utest:: Run unit tests (builds tests if needed)
-c Clean the build
+

Built components appear in the _install directory of the SDK root.

+

+Example Programs

+

The SDK includes several examples that show you different aspects of how the Intel® EPID scheme works. In the SDK build, these examples are located in _install/epid-sdk/example.

+ + + + + + + +
Name Description
signmsg Create Intel® EPID signature of message
verifysig Verify signature is from a group member in good standing
+

+Building with Other Build Systems

+

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.

+
+basicdoc.png +
+
+
+ + + + + diff --git a/doc/html/ChangeLog.html b/doc/html/ChangeLog.html new file mode 100644 index 0000000..ed8fc9f --- /dev/null +++ b/doc/html/ChangeLog.html @@ -0,0 +1,106 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: What's New + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
What's New
+
+
+

2.0.0

+

New in This Release

+
    +
  • 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
    • +
    +
  • +
+

Changes

+
    +
  • The default hash algorithm has changed. It is now SHA-512.
  • +
  • Functions that returned EpidNullPtrErr now return EpidBadArgErr instead.
  • +
+

Fixes

+
    +
  • Updated build flags to work around GCC 4.8.5 defect.
  • +
+

Known Issues

+
    +
  • SHA-512/256 hash algorithm is not supported.
  • +
  • Compressed key sample material is not included in the package.
  • +
+
+
+ + + + + diff --git a/doc/html/EpidOverview.html b/doc/html/EpidOverview.html new file mode 100644 index 0000000..ae20c68 --- /dev/null +++ b/doc/html/EpidOverview.html @@ -0,0 +1,172 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Introduction to the Intel® EPID Scheme + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
Introduction to the Intel® EPID Scheme
+
+
+ +

Intel® EPID is a cryptographic protocol which enables the remote authentication of a trusted platform whilst preserving the user's privacy.

+

+Roles

+

In the Intel® EPID scheme, there are three roles: issuers, members, and verifiers.

+

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.

+
+epid_diagram_high_level_use_case.png +
+

+Issuers

+

The issuer is responsible for managing group membership.

+

The issuer manages groups by doing the following:

+
    +
  • Creates groups by generating one issuing private key and one group certificate for each group. The group certificate contains the group public key.
  • +
  • Creates group members by generating unique Intel® EPID member private keys through bulk provisioning. Member private keys are created from the issuing private key for the group.
  • +
  • Manages requests from prospective members to join existing groups by using the join protocol.
  • +
  • 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.
  • +
  • Creates and maintains group revocation lists.
  • +
  • Makes group public keys and revocation lists available to verifiers.
  • +
+
+epid_diagram_issuer_high_level.png +
+

+Members

+

The member is the entity that attempts to anonymously prove its group membership to the verifier.

+
    +
  • Members are authorized by the issuer as part of a group.
  • +
  • Each group member has a unique Intel® EPID private key, which corresponds to the group.
  • +
  • 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.
  • +
+
+epid_diagram_member_high_level.png +
+

+Verifiers

+

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.

+

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.

+

A verifier can do the following:

+
    +
  • Confirm a member is in fact a member of a given group in good standing.
  • +
  • Obtain group certificates and revocation lists from issuers.
  • +
  • Negotiate details of signature protocol with members.
  • +
+
+epid_diagram_verifier_high_level.png +
+

+Groups

+

An Intel® 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.

+

All groups have the following:

+
    +
  • Group public key, which corresponds to the issuing private key kept by the issuer
  • +
  • Signature based revocation list
  • +
  • Private key based revocation list
  • +
  • Member private keys, generated from the issuing private key
  • +
+

If a signature based revocation list or private key based revocation list does not exist, it is assumed to be empty.

+

+Keys

+

The Intel® 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.

+

Additionally, in the Intel® 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 Revocation.

+

+Group Public Key

+

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.

+

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.

+

+Issuing Private Key

+

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.

+

+Member Private Key

+

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.

+

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.

+

+Member and Verifier Interaction

+

Each Intel® EPID member uses its Intel® EPID private key to digitally sign a message. The resulting signature is called an Intel® EPID signature.

+

The Intel® EPID verifier uses the group public key to verify the correctness of an Intel® EPID signature, i.e., to verify that the signature was indeed created by a member with a valid Intel® EPID private key.

+

However, the Intel® EPID signature does not convey any information about which unique private key was used to create the signature.

+
+epid_diagram_high_level_interaction.png +
+
+
+ + + + + diff --git a/doc/html/Glossary.html b/doc/html/Glossary.html new file mode 100644 index 0000000..09a29e6 --- /dev/null +++ b/doc/html/Glossary.html @@ -0,0 +1,170 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Glossary + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
Glossary
+
+
+ +

+DAA

+

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® 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.

+

+Elliptic curve

+

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.

+

+Elliptic curve point

+

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.

+

+Group

+

An Intel® 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.

+

All groups have the following:

+
    +
  • Group public key, which corresponds to the issuing private key kept by the issuer
  • +
  • Signature based revocation list
  • +
  • Private key based revocation list
  • +
  • Member private keys, generated from the issuing private key
  • +
+

If a signature based revocation list or private key based revocation list does not exist, it is assumed to be empty.

+

+Group certificate

+

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.

+

+Group public key

+

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.

+

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.

+

+Intel® EPID

+

Enhanced Privacy ID (Intel® EPID) is a cryptographic protocol for attestation of a trusted platform while preserving the user's privacy. Intel® EPID can be used as a foundational building block for a multitude of security solutions.

+

+Intel® EPID signature

+

An Intel® 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.

+

+Issuer

+

The issuer is the entity in the Intel® EPID scheme that is responsible for managing group membership. An example of an issuer is the Intel Key Generation Facility.

+

The issuer manages groups by doing the following:

+
    +
  • Creates groups by generating one issuing private key and one group certificate for each group. The group certificate contains the group public key.
  • +
  • Creates group members by generating unique Intel® EPID member private keys through bulk provisioning. Member private keys are created from the issuing private key for the group.
  • +
  • Manages requests from prospective members to join existing groups by using the join protocol.
  • +
  • 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.
  • +
  • Creates and maintains group revocation lists.
  • +
  • Makes group public keys and revocation lists available to verifiers.
  • +
+

+Issuing private key

+

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.

+

+Member

+

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® 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® EPID member private key.

+

+Name-based signature

+

A name-based signature is a type of signature that gives the verifier the ability to link Intel® EPID signatures from the same member, reducing the member's privacy.

+

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.

+

+Member private key

+

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.

+

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.

+

+Non-revoked proof

+

A non-revoked proof is part of an Intel® 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.

+

+Pairing

+

Pairing is a mathematical operation that maps two elliptic curve groups to a third multiplicative group.

+

+Revocation, revocation lists

+

Revocation lists are data structures used by the verifier to identify members that are no longer approved members of the group.

+

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

+

The verifier is the entity that checks an Intel® EPID signature to establish whether it was signed by an entity or device that is a member in good standing.

+

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.

+
+
+ + + + + diff --git a/doc/html/ImplementationNotes.html b/doc/html/ImplementationNotes.html new file mode 100644 index 0000000..c8a9555 --- /dev/null +++ b/doc/html/ImplementationNotes.html @@ -0,0 +1,110 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Implementation Notes + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
Implementation Notes
+
+
+ +

+Random Number Generation

+

Some SDK APIs require a random number data source. A BitSupplier provides a source of random data. This function should be a cryptographically secure random number generator.

+
Warning
The pseudo-random number generator provided with the examples is for sample use only and is not suitable for cryptographically secure applications.
+

+Protecting Secrets

+

Member code works with private keys, so member code must be run in a trusted environment.

+
Warning
If member memory is available to an untrusted source, the member private key could be exposed.
+

The EpidZeroMemory function is used by the memory allocation routines EpidAlloc, EpidRealloc and EpidFree to wipe the memory as memory is freed.

+
Warning
The EpidZeroMemory 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).
+

+Replacing Math Primitives

+

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 the epid/common/math directory. Math functionality has detailed tests to ease validation.

+

+Octstring/Buffer Types

+

Serialized information in the SDK is passed in fixed size buffer types whenever possible. Collectively these fixed size buffer types are called Octstrings.

+

In epid/common/types.h, 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.

+

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).

+

Str types generally represent fixed size groups of numbers such as a point or vector.

+

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.

+
#pragma pack(1)
// OctStr* type holding 256 bits
typedef struct OctStr256 {
unsigned char data[256 / CHAR_BIT];
// Str type consisting of a single 256 bit number
typedef struct FqElemStr {
// Str type consisting of a two other Str types
typedef struct G1ElemStr {

Many APIs use void* parameters where OctStr* types are expected. If more than one size is allowed, a size parameter is usually also required.

+

+Flexible Arrays

+

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.

+
typedef struct Sample {
OctStr32 data;
OctStr32 count;
G1ElemStr array[1];
} Sample;

Flexible array types are expected to be in a buffer of size sizeof(FA) + ((N-1) * sizeof(E)) 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 sizeof(FA) if N is 0, in which case referencing any element is an error.

+
Sample* AllocSample(size_t count) {
return (Sample*)malloc(sizeof(Sample)
+ (count * sizeof(G1ElemStr))
- sizeof(G1ElemStr));
}

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.

+
+
+ + + + + diff --git a/doc/html/IssuerMaterial.html b/doc/html/IssuerMaterial.html new file mode 100644 index 0000000..67d8ab0 --- /dev/null +++ b/doc/html/IssuerMaterial.html @@ -0,0 +1,136 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Sample Issuer Material + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
Sample Issuer Material
+
+
+ +

Because the SDK does not include issuer APIs, pre-generated sample data is included for validation purposes.

+
Note
Sample compressed key material is not included in the package.
+

+Sample Groups

+

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.

+

All groups have the following:

+
    +
  • Group public key, which corresponds to the issuing private key kept by the issuer
  • +
  • Signature based revocation list
  • +
  • Private key based revocation list
  • +
  • Member private keys, generated from the issuing private key
  • +
+

If a signature based revocation list or private key based revocation list does not exist, it is assumed to be empty.

+

+groupa

+

There are eight members in groupa:

+
    +
  • groupa/member0 - A non-revoked member.
  • +
  • groupa/member1 - Another non-revoked member.
  • +
  • groupa/privrevokedmember0 - A revoked member. Revoked by Private-Key based revocation list (groupa/privrl.bin)
  • +
  • groupa/privrevokedmember1 - A revoked member. Revoked by Private-Key based revocation list (groupa/privrl.bin)
  • +
  • groupa/privrevokedmember2 - A revoked member. Revoked by Private-Key based revocation list (groupa/privrl.bin)
  • +
  • groupa/sigrevokedmember0 - A revoked member. Revoked by Signature based revocation list (groupa/sigrl.bin)
  • +
  • groupa/sigrevokedmember1 - A revoked member. Revoked by Signature based revocation list (groupa/sigrl.bin)
  • +
  • groupa/sigrevokedmember2 - A revoked member. Revoked by Signature based revocation list (groupa/sigrl.bin)
  • +
+

The following are groupa revocation lists:

+
    +
  • groupa/privrl.bin - Private-Key based revocation list. privrevokedmember0, privrevokedmember1 and privrevokedmember2** revoked.
  • +
  • groupa/sigrl.bin - Signature based revocation list. sigrevokedmember0, sigrevokedmember0 and sigrevokedmember0** revoked.
  • +
+

+groupb

+

There are four members in groupb:

+
    +
  • groupb/member0 - A non-revoked member.
  • +
  • groupb/member1 - Another non-revoked member.
  • +
  • groupb/privrevokedmember0 - A revoked member. Revoked by Private-Key based revocation list (groupb/privrl.bin)
  • +
  • groupb/sigrevokedmember0 - A revoked member. Revoked by Signature based revocation list (groupb/sigrl.bin)
  • +
+

The following are groupb revocation lists:

+
    +
  • groupb/privrl.bin - Private-Key based revocation list. privrevokedmember0 revoked.
  • +
  • groupb/sigrl.bin - Signature based revocation list. sigrevokedmember0 revoked.
  • +
+

+Group Based Revocation Lists

+

If an entire group is no longer valid, the issuer can revoke it using the group based revocation list. Two sample group based revocation lists are provided with the SDK.

+
    +
  • grprl_empty.bin - No entries
  • +
  • grprl.bin - One entry in which groupb is revoked.
  • +
+
+
+ + + + + diff --git a/doc/html/LegalInformation.html b/doc/html/LegalInformation.html new file mode 100644 index 0000000..959bf33 --- /dev/null +++ b/doc/html/LegalInformation.html @@ -0,0 +1,84 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Legal Information + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
Legal Information
+
+
+

INFORMATION IN THIS DOCUMENT IS PROVIDED IN CONNECTION WITH INTEL® 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.

+

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.

+

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.

+

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.

+

Contact your local Intel sales office or your distributor to obtain the latest specifications and before placing your product order.

+

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 http://www.intel.com.

+

Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and other countries.

+

*Other names and brands may be claimed as the property of others.

+
+
+ + + + + diff --git a/doc/html/SdkOverview.html b/doc/html/SdkOverview.html new file mode 100644 index 0000000..b9432df --- /dev/null +++ b/doc/html/SdkOverview.html @@ -0,0 +1,163 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: What's Included in the SDK + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
What's Included in the SDK
+
+
+ +

+SDK Components

+

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.

+
+sdk_block_diagram.png +
+


+ The Intel® EPID SDK is divided into the following components:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Component Description
member Library containing APIs needed to implement a member
verifier Library containing APIs needed to implement a verifier
common Library containing common types and functions
math Math primitives used by member and verifier
IPP A C-only non-optimized subset of Intel® IPP
signmsg A sample program showing how to sign messages
verfifysig A sample program showing how to verify signatures
util Common utilities used by samples
gtest gtest unit test framework
Build Scripts Scripts to configure and build the SDK
Sample Issuer Material Sample keys and revocation lists
+

Math primitives are implemented in the math sub-component of common. The reference math primitive implementation is based on a non-optimized Vanilla C subset of the Intel® Performance Primitives. Math is designed so that you can replace its implementation to call custom hardware IP blocks or optimized libraries.

+

+Filesystem Layout

+

The Intel® EPID SDK has two filesystem layouts: the Source Layout and the Install Layout.

+

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.

+

The Install Layout is the layout of files under the _install folder after you build the SDK.

+

+Source Layout

+

The Source Layout is used by the build scripts in the Intel® EPID SDK to find components and files needed to create libraries and executables.

epid-sdk/
+|__ LICENSE.txt             Distribution license
+|__ NOTICE.txt              Legal notices
+|__ README.md               Readme
+|__ RELEASE_NOTES.md        Release notes
+|__ SConstruct              Main 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
+|   |__ signmsg/            Source for message signing example
+|   |__ util/               Common utilities for examples
+|   |__ verifysig/          Source for signature validation signing example
+|
+|__ ext/
+|   |__ gtest/             Third party gtest library
+|   |__ ipp/               IPP library
+|
+|__ parts-site/            Parts platform config scripts
+

+Install Layout

+

The Install Layout contains the data developers need to develop and build their applications using the Intel® 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.

_install/
+|__ epid-sdk/
+    |__ include/            C include header files for the SDK
+    |__ lib/
+    |   |__ <platform>      Target specific static libraries for the SDK
+    |
+    |__example/             Sample applications and data
+    |__test/                Unit test executables (if unit tests built)
+
+ + + + + diff --git a/doc/html/SignVerifyTutorial.html b/doc/html/SignVerifyTutorial.html new file mode 100644 index 0000000..3aca35d --- /dev/null +++ b/doc/html/SignVerifyTutorial.html @@ -0,0 +1,192 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Signing and Verification Tutorial + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
Signing and Verification Tutorial
+
+
+ +

The Intel® EPID SDK provides example tools to show you how to use the Intel® EPID SDK APIs. These examples are called signmsg and verifysig.

+

You can build these examples using the instructions in Building From Source. The tutorial assumes _install/epid-sdk/example is the current directory.

+

All command lines in this tutorial use posix command line conventions; for other systems, adjust accordingly.

+

For the code used in this tutorial, refer to Examples.

+
Note
The data for running this tutorial is pre-generated. Once the samples are built, the data is in the _install/epid-sdk/example/data directory. See Sample Issuer Material.
+

+Creating an Intel® EPID Signature of a Given Message

+

The example application signmsg shows you how to create an Intel® EPID Signature of a given message.

$ ./signmsg -h
+Usage: signmsg [OPTION]...
+Create Intel(R) EPID signature of message
+
+Options:
+
+--sig=FILE            write signature to FILE (default: sig.dat)
+--msg=MESSAGE         MESSAGE to sign
+--bsn=BASENAME        BASENAME to sign with (default: random)
+--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
+--mprecmpo=FILE       write pre-computed member data to FILE
+--hashalg=NAME        SHA-256 | SHA-384 | SHA-512 (default: SHA-512)
+--capubkey=FILE       load IoT Issuing CA public key from FILE
+                        (default: cacert.bin)
+-h,--help             display this help and exit
+-v,--verbose          print status messages to stdout
+

To sign a message, a group member in good standing uses the following command:

$ ./signmsg --msg="test0"
+

The above command signs a message "test0". signmsg uses default options for the group public key, member private key, and hash algorithm (SHA-512). All other parameters that are not given are ignored. The command produces a signature file: sig.dat

+

+Verifying an Intel® EPID Signature

+

The example application verifysig shows you how to verify that a given Intel® EPID Signature is produced by a member in good standing.

$ ./verifysig -h
+Usage: verifysig [OPTION]...
+Verify signature was created by group member in good standing
+
+Options:
+
+--sig=FILE            load signature from FILE (default: sig.dat)
+--msg=MESSAGE         MESSAGE that was signed (default: empty)
+--bsn=BASENAME        BASENAME used in signature (default: random)
+--privrl=FILE         load private key based 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
+--hashalg=NAME        SHA-256 | SHA-384 | SHA-512 (default: SHA-512)
+--capubkey=FILE       load IoT Issuing CA public key from FILE
+                        (default: cacert.bin)
+-h,--help             display this help and exit
+-v,--verbose          print status messages to stdout
+

To verify that a signature is from a member in good standing, the verifier uses the following command:

$ ./verifysig --msg="test0"
+signature verified successfully
+

This verifies that the default signature file sig.dat is generated for the message "test0" by a member in good standing. verifysig uses default inputs for group public key and hash algorithm (SHA-512). All other parameters are ignored. The output verifysig: signature verified successfully denotes that the verification is successful.

+

+Linking Intel® EPID Signatures from the Same Member

+

A name-based signature is a type of signature that gives the verifier the ability to link Intel® EPID signatures from the same member, reducing the member's privacy.

+

The verifier can ask the member to sign a message with a basename that the verifier chooses. If the member uses the name-based signature option (i.e., in cases where a basename is specified), then all the signatures created by the member using the same basename are linkable by the verifier.

+
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.
+

A name-based signature is created using the additional parameter of a 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.

+

If basename is not provided, then the member uses a random basename and the signature generated by the member is anonymous.

+

To Sign message "test0" with a basename "base0":

$ ./signmsg --msg="test0" --bsn="base0"
+

To verify the signature:

$ ./verifysig --msg="test0" --bsn="base0"
+verifysig: signature verified successfully
+

+Expected Failures

+

The signature verification process fails if there is a parameter mismatch between sign and verify operations. Here are some examples.

+

Verification fails if there is a mismatch in the message:

$ ./signmsg --msg="test0"
+$ ./verifysig --msg="test1"
+verifysig: signature verification failed: invalid signature
+

Verification fails if there is a mismatch in the basename:

$ ./signmsg --msg="test0" --bsn="base0"
+$ ./verifysig --msg="test0" --bsn="base1"
+verifysig: signature verification failed: invalid signature
+

The Intel® EPID SDK supports the following hash algorithms: SHA-256, SHA-384, SHA-512. The selected hash algorithm must be the same for both sign and verify. Mismatch in hash algorithm results in verification failure:

$ ./signmsg --msg="test0" --hashalg=SHA-256
+$ ./verifysig --msg="test0" --hashalg=SHA-384
+verifysig: signature verification failed: invalid signature
+

+Revocation

+

Revocation lists are data structures used by the verifier to identify members that are no longer approved members of the group.

+

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).

+

+Detecting Revoked Group from Group Revocation List

+

Verification of a signature fails if it is generated by a member of a group that is revoked in the group revocation list.

+

For example,

$ ./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
+

The verification fails because groupb is revoked and is an entry in the group revocation list (grprl.bin).

+

+Detecting Revoked Member from Private Key Based Revocation List

+

Verification of a signature fails if it is generated by a member whose private key is revoked in a private-key based revocation list.

+

For example,

$ ./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
+

The verification fails because the private key of privrevokedmember0 is revoked and is an entry in the private key based revocation list of groupa (privrl.bin).

+

+Detecting Revoked Member from Signature Based Revocation List

+

Verification of a signature fails if it is generated by a member whose signature is revoked in a signature based revocation list.

$ ./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
+

The message "test1" is signed by signmsg with a warning signmsg: signature revoked in SigRL. This means that the signature of sigrevokedmember0 is revoked in the signature based revocation list. The verification fails because the signature was generated by sigrevokedmember0, which is revoked and is an entry in the signature based revocation list of groupa (sigrl.bin).

+
+
+ + + + + diff --git a/doc/html/annotated.html b/doc/html/annotated.html new file mode 100644 index 0000000..3fbd079 --- /dev/null +++ b/doc/html/annotated.html @@ -0,0 +1,136 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Structures + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
Data Structures
+
+
+
Here are the data structures with brief descriptions:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 CAllowedBasenameInternal implementation of base name
 CBasicSignatureIntel(R) EPID 2.0 basic signature
 CBigNumStrSerialized BigNum
 CCommitValuesStorage for values to create commitment in Sign and Verify algorithms
 CCompressedPrivKeyCompressed private key
 CEcdsaPrivateKeyECDSA Private Key
 CEcdsaPublicKeyECDSA Public Key
 CEcdsaSignatureECDSA Signature using NIST 256-bit curve secp256r1
 CEpid2ParamsIntel(R) EPID 2.0 Parameters
 CEpid2Params_Internal representation of Epid2Params
 CEpidCaCertificateIoT CA Certificate binary format
 CEpidFileHeaderIntel(R) EPID binary file header
 CEpidGroupPubKeyCertificateIntel(R) EPID 2.0 Group Public Key binary format
 CEpidSignatureIntel(R) EPID 2.0 Signature
 CErrorTextEntryRecord mapping status code to string
 CFpElemStrNumber in [0, p-1]
 CFq12ElemDatData for element in Fq2^3^2
 CFq12ElemStrSerialized Fq2^3^2 element
 CFq2ElemDatData for element in Fq2
 CFq2ElemStrSerialized Fq2 element
 CFq6ElemDatData for element in Fq2^3
 CFq6ElemStrSerialized Fq2^3 element
 CFqElemDatData for element in Fq
 CFqElemStrNumber in [0, q-1]
 CG1ElemStrSerialized G1 element
 CG2ElemStrSerialized G2 element
 CGroupPubKeyIntel(R) EPID 2.0 group public key
 CGroupPubKey_Internal representation of GroupPubKey
 CGroupRlGroup revocation list
 CGtElemStrSerialized GT element
 CIPrivKeyIntel(R) EPID 2.0 issuing private key
 CJoinPCommitValuesStorage for values to create commitment in Sign and Verify algorithms
 CJoinRequestJoin request
 CMemberCtxMember context definition
 CMemberPrecompPre-computed member settings
 CMembershipCredentialMembership credential
 CNrProofNon-revoked Proof
 CNrVerifyCommitValuesStorage for values to create commitment in NrProve algorithm
 COctStr128128 bit octet string
 COctStr1616 bit octet string
 COctStr256256 bit octet string
 COctStr3232 bit octet string
 COctStr512512 bit octet string
 COctStr6464 bit octet string
 COctStr88 bit octet string
 CPreComputedSignaturePre-computed signature
 CPrivKeyIntel(R) EPID 2.0 private key
 CPrivKey_Internal implementation of PrivKey
 CPrivRlPrivate-key based revocation list
 CSha256DigestSHA256 digest
 CSigRlSignature based revocation list
 CSigRlEntryEntry in SigRL (B,K)
 CStackInternal representation of a Stack
 CVerifierCtxVerifier context definition
 CVerifierPrecompPre-computed member settings
 CVerifierRl
+
+
+
+ + + + + diff --git a/doc/html/arrowdown.png b/doc/html/arrowdown.png new file mode 100644 index 0000000000000000000000000000000000000000..0b63f6d38c4b9ec907b820192ebe9724ed6eca22 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0y~yU=UznU=ZVAV_;x7xk{#nfq`MKr;B4q1>@Vhihj(F z5=TGEFKK_k5wqa?1D?=ahXjEurkR(76J85s@NhOUGq5u>9t}5-mE%lWepi;Uqf71m z{OS2=-_EA&i>$w5!uw}d@(=FzhI$T(E!{^y{WLCPvfUHg-?n_KaEwzcCzmLr=l*V6 zC-&_#>zx*^v);jxy=5y`_=dB74rP`7XD?ned3^snGwa;g6OSU_JYHVoTgx1KM+Mx1^?q-;~e(vK>ne<2)xN=7sOn7cwv~FnGH9xvX@VfwtS3% zB5wQ>Z?G+OS$!q@2%m^mr`yT^?;Fjw9AOU2uWshOY7y*F@$rm7Z&F@S(dVw}PkZ<8 zo20^d;Cu*UR{+<7Z+jxv_>138F?;of@zV#T4N{wew`}wmUFy`JvG744^GnTH+L4S$ zIyf(_IvsTKf?Ze%3&+Xgj$BKPSIjL>1m`TxZqju)v0V3#%4eP=&P&l5sl5BW3v|Em k$>cEAIRBLX?^wVdmdKI;Vst0IVihlK=n! literal 0 HcmV?d00001 diff --git a/doc/html/basicdoc.png b/doc/html/basicdoc.png new file mode 100644 index 0000000000000000000000000000000000000000..e092eb64db088145daa571cd093c338c269ba0ff GIT binary patch literal 19922 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 literal 0 HcmV?d00001 diff --git a/doc/html/bc_s.png b/doc/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmeAS@N?(olHy`uVBq!ia0y~yVBlb2V36ZrV_;wqY>4M&U|`Djba4!+V0=6GbhdDy z$g%Ttcb+`6#8YkZGXC6IYKEp}T6srWr?B1GF(F9Dgj?HVt465w+N3F~L=2m{I{LlD z^>%5vZqF6G-~TJ)wO6ipu)6bXjiwh*F19Y=5PHv}_T<_>?)LXZ=brv~w|9jRwclw=A z?M&zHUgY;R*`eBLylJ`psaF}A4gY^O%Fm2B5}9e|mBi(c{`-FBy$*q2n=WRjOR}*p zfBY&&@WtM>%(GnQhCZ8Hrfu)q@J^}V*|pnFG0l-`VjpgNRw?t~DC2x;r?WccM z%Omn1@irTG-CEDAzJ9+RYg5`mgEysJmY;n7W;LYAo9$3t&1meNHsy-)mEv3(1`Syq z@t=pYwN6di?6r!ub^RVD1}~=5i}Ig{wN2S0S{h%+$*`d)R#lZfS1eDaG`5P5VMCE= z^x0z@R^R$Gm60JLb?c-y&!09YUR*eu&fwsA<<`9iTVESDS?SxbGI$-AnRFpglk?-w z))MJk_rJ3+X!!n)F*APYoSvijm+7tb{~abbGah}k{T}t&$Z~D@q`Q~4Y!~SWvp(e` zVceXhX1;R!uD#zA6+PP+HDAA0(fxK@?D8*$&9kMu%}YGP_Juw8c;!!0+6oK)g(sSw zY~HWlnwgvTf6fV!_7>ip`-^|dGPU1!;hwI1lEZZJTJ>Wl_HWi~`r*qYH%WNrY>^GS z)7LcBm>zvDv~{n$U&>{X3q>_wrW{sld81^mt-e{7!GY7X-Tl!#sfouWS|6QU6KDPP n@q}r5#vGT5l>WvCZQg&#VN<^6zNab-3=9mOu6{1-oD!My(o5xe(dH6;i_@% literal 0 HcmV?d00001 diff --git a/doc/html/bignum_8c.html b/doc/html/bignum_8c.html new file mode 100644 index 0000000..4ad4279 --- /dev/null +++ b/doc/html/bignum_8c.html @@ -0,0 +1,120 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/math/bignum.c File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
bignum.c File Reference
+
+
+ +

Big number implementation. +More...

+
#include "epid/common/math/bignum.h"
+#include "epid/common/math/bignum-internal.h"
+#include "epid/common/memory.h"
+#include "ext/ipp/include/ippcp.h"
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

EpidStatus NewBigNum (size_t data_size_bytes, BigNum **bignum)
 Constructs a new BigNum. More...
 
void DeleteBigNum (BigNum **bignum)
 Deletes a previously allocated BigNum. More...
 
EpidStatus ReadBigNum (void const *bn_str, size_t strlen, BigNum *bn)
 Deserializes a BigNum from a string. More...
 
EpidStatus WriteBigNum (BigNum const *bn, size_t strlen, void const *bn_str)
 Serializes a BigNum to a string. More...
 
+int OctStr2Bnu (uint32_t *bnu_ptr, void const *octstr_ptr, int octstr_len)
 convert octet string into "big number unsigned" representation
 
EpidStatus BigNumAdd (BigNum const *a, BigNum const *b, BigNum *r)
 Adds two BigNum values. More...
 
EpidStatus BigNumSub (BigNum const *a, BigNum const *b, BigNum *r)
 Subtracts two BigNum values. More...
 
EpidStatus BigNumMul (BigNum const *a, BigNum const *b, BigNum *r)
 Multiplies two BigNum values. More...
 
EpidStatus BigNumMod (BigNum const *a, BigNum const *b, BigNum *r)
 Computes modular reduction for BigNum value by specified modulus. More...
 
+

Detailed Description

+

Big number implementation.

+
+
+ + + + + diff --git a/doc/html/bignum_8h.html b/doc/html/bignum_8h.html new file mode 100644 index 0000000..ac66718 --- /dev/null +++ b/doc/html/bignum_8h.html @@ -0,0 +1,124 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/math/bignum.h File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
bignum.h File Reference
+
+
+ +

Big number interface. +More...

+
#include <stddef.h>
+#include <stdint.h>
+#include "epid/common/errors.h"
+#include "epid/common/types.h"
+
+ + + + +

+Typedefs

+typedef struct BigNum BigNum
 Internal representation of large numbers.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

EpidStatus NewBigNum (size_t data_size_bytes, BigNum **bignum)
 Constructs a new BigNum. More...
 
void DeleteBigNum (BigNum **bignum)
 Deletes a previously allocated BigNum. More...
 
EpidStatus ReadBigNum (void const *bn_str, size_t strlen, BigNum *bn)
 Deserializes a BigNum from a string. More...
 
EpidStatus WriteBigNum (BigNum const *bn, size_t strlen, void const *bn_str)
 Serializes a BigNum to a string. More...
 
EpidStatus BigNumAdd (BigNum const *a, BigNum const *b, BigNum *r)
 Adds two BigNum values. More...
 
EpidStatus BigNumSub (BigNum const *a, BigNum const *b, BigNum *r)
 Subtracts two BigNum values. More...
 
EpidStatus BigNumMul (BigNum const *a, BigNum const *b, BigNum *r)
 Multiplies two BigNum values. More...
 
EpidStatus BigNumMod (BigNum const *a, BigNum const *b, BigNum *r)
 Computes modular reduction for BigNum value by specified modulus. More...
 
+

Detailed Description

+

Big number interface.

+
+
+ + + + + diff --git a/doc/html/bitsupplier_8h.html b/doc/html/bitsupplier_8h.html new file mode 100644 index 0000000..c89b3b2 --- /dev/null +++ b/doc/html/bitsupplier_8h.html @@ -0,0 +1,92 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/bitsupplier.h File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
bitsupplier.h File Reference
+
+
+ +

Random data supplier interface. +More...

+ + + + + +

+Typedefs

typedef int(__STDCALL * BitSupplier) (unsigned int *rand_data, int num_bits, void *user_data)
 Generates random data. More...
 
+

Detailed Description

+

Random data supplier interface.

+
+
+ + + + + diff --git a/doc/html/building__sdk_8dox.html b/doc/html/building__sdk_8dox.html new file mode 100644 index 0000000..6e2f6fe --- /dev/null +++ b/doc/html/building__sdk_8dox.html @@ -0,0 +1,82 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: doc/docsrc/building_sdk.dox File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
doc/docsrc/building_sdk.dox File Reference
+
+
+ +

This file is used by Doxygen to generate documentation. +More...

+

Detailed Description

+

This file is used by Doxygen to generate documentation.

+
+
+ + + + + diff --git a/doc/html/check__privrl__entry_8c.html b/doc/html/check__privrl__entry_8c.html new file mode 100644 index 0000000..7750685 --- /dev/null +++ b/doc/html/check__privrl__entry_8c.html @@ -0,0 +1,93 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/verifier/check_privrl_entry.c File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
check_privrl_entry.c File Reference
+
+
+ +

EpidCheckPrivRlEntry implementation. +More...

+ + + + + +

+Functions

EpidStatus EpidCheckPrivRlEntry (VerifierCtx const *ctx, BasicSignature const *sig, FpElemStr const *f)
 Verifies a signature has not been revoked in the private key based revocation list. More...
 
+

Detailed Description

+

EpidCheckPrivRlEntry implementation.

+
+
+ + + + + diff --git a/doc/html/classes.html b/doc/html/classes.html new file mode 100644 index 0000000..1a92e1c --- /dev/null +++ b/doc/html/classes.html @@ -0,0 +1,113 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Structure Index + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
Data Structure Index
+
+
+
A | B | C | E | F | G | I | J | M | N | O | P | S | V
+ + + + + + + + + + + + + + + + + + + + +
  A  
+
Epid2Params_   
  G  
+
MemberPrecomp   PrivKey   
EpidCaCertificate   MembershipCredential   PrivKey_   
AllowedBasename   EpidFileHeader   G1ElemStr   
  N  
+
PrivRl   
  B  
+
EpidGroupPubKeyCertificate   G2ElemStr   
  S  
+
EpidSignature   GroupPubKey   NrProof   
BasicSignature   ErrorTextEntry   GroupPubKey_   NrVerifyCommitValues   Sha256Digest   
BigNumStr   
  F  
+
GroupRl   
  O  
+
SigRl   
  C  
+
GtElemStr   SigRlEntry   
FpElemStr   
  I  
+
OctStr128   Stack   
CommitValues   Fq12ElemDat   OctStr16   
  V  
+
CompressedPrivKey   Fq12ElemStr   IPrivKey   OctStr256   
  E  
+
Fq2ElemDat   
  J  
+
OctStr32   VerifierCtx   
Fq2ElemStr   OctStr512   VerifierPrecomp   
EcdsaPrivateKey   Fq6ElemDat   JoinPCommitValues   OctStr64   VerifierRl   
EcdsaPublicKey   Fq6ElemStr   JoinRequest   OctStr8   
EcdsaSignature   FqElemDat   
  M  
+
  P  
+
Epid2Params   FqElemStr   
MemberCtx   PreComputedSignature   
+
A | B | C | E | F | G | I | J | M | N | O | P | S | V
+
+
+ + + + + diff --git a/doc/html/closed.png b/doc/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0y~yVBiE{4mJh`h6fYb1Q-|?yggkULn;{G-p%E8P~>R4 z=$<|EB$N38-2}DbmnFr_%O)K7`0vvPK}LtC*|iL-j2e1dIRjJ=#-IMT-)|GIo|S=1 k_R{V{v-v8NIIqptTqq(?amn;60|Nttr>mdKI;Vst0N5uiMgRZ+ literal 0 HcmV?d00001 diff --git a/doc/html/commitment_8c.html b/doc/html/commitment_8c.html new file mode 100644 index 0000000..13a543a --- /dev/null +++ b/doc/html/commitment_8c.html @@ -0,0 +1,98 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/commitment.c File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
commitment.c File Reference
+
+
+ +

Commitment hash implementation. +More...

+
#include <limits.h>
+#include "epid/common/commitment.h"
+#include "epid/common/memory.h"
+#include "epid/common/epid2params_ate.inc"
+
+ + + + + + + +

+Functions

EpidStatus SetCalculatedCommitValues (G1ElemStr const *B, G1ElemStr const *K, G1ElemStr const *T, EcPoint const *R1, EcGroup *G1, FfElement const *R2, FiniteField *GT, CommitValues *values)
 Set CommitValues structure fields calculated in algorithm. More...
 
EpidStatus CalculateCommitmentHash (CommitValues const *values, FiniteField *Fp, HashAlg hash_alg, void const *msg, size_t msg_len, FfElement *c)
 Calculate Fp.hash(t3 || m) for Sign and Verfiy algorithms. More...
 
+

Detailed Description

+

Commitment hash implementation.

+
+
+ + + + + diff --git a/doc/html/commitment_8h.html b/doc/html/commitment_8h.html new file mode 100644 index 0000000..fc9e54f --- /dev/null +++ b/doc/html/commitment_8h.html @@ -0,0 +1,108 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/commitment.h File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
commitment.h File Reference
+
+
+ +

Commitment hash interface. +More...

+ + + + + +

+Data Structures

struct  CommitValues
 Storage for values to create commitment in Sign and Verify algorithms. More...
 
+ + + + + + + + + + +

+Functions

EpidStatus SetKeySpecificCommitValues (GroupPubKey const *pub_key, CommitValues *values)
 Set group public key related fields from CommitValues structure. More...
 
EpidStatus SetCalculatedCommitValues (G1ElemStr const *B, G1ElemStr const *K, G1ElemStr const *T, EcPoint const *R1, EcGroup *G1, FfElement const *R2, FiniteField *GT, CommitValues *values)
 Set CommitValues structure fields calculated in algorithm. More...
 
EpidStatus CalculateCommitmentHash (CommitValues const *values, FiniteField *Fp, HashAlg hash_alg, void const *msg, size_t msg_len, FfElement *c)
 Calculate Fp.hash(t3 || m) for Sign and Verfiy algorithms. More...
 
+

Detailed Description

+

Commitment hash interface.

+
+
+ + + + + diff --git a/doc/html/decompress__privkey_8c.html b/doc/html/decompress__privkey_8c.html new file mode 100644 index 0000000..b34aa82 --- /dev/null +++ b/doc/html/decompress__privkey_8c.html @@ -0,0 +1,124 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/member/decompress_privkey.c File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
decompress_privkey.c File Reference
+
+
+ +

EpidDecompressPrivKey implementation. +More...

+
#include "epid/member/api.h"
+#include "epid/common/memory.h"
+#include "epid/common/epid2params.h"
+#include "epid/common/math/bignum-internal.h"
+#include "epid/common/math/hash.h"
+#include "epid/member/privkey.h"
+
+ + + + +

+Macros

#define BREAK_ON_EPID_ERROR(ret)
 Handle Intel(R) EPID Error with Break. More...
 
+ + + + +

+Functions

EpidStatus EpidDecompressPrivKey (GroupPubKey const *pub_key, CompressedPrivKey const *compressed_privkey, PrivKey *priv_key)
 Decompresses compressed member private key. More...
 
+

Detailed Description

+

EpidDecompressPrivKey implementation.

+

Macro Definition Documentation

+ +
+
+ + + + + + + + +
#define BREAK_ON_EPID_ERROR( ret)
+
+Value:
if (kEpidNoErr != (ret)) { \
break; \
}
no error
Definition: errors.h:41
+
+

Handle Intel(R) EPID Error with Break.

+ +
+
+
+
+ + + + + diff --git a/doc/html/dir_02c945662023679b89476bd7126bc985.html b/doc/html/dir_02c945662023679b89476bd7126bc985.html new file mode 100644 index 0000000..34c3526 --- /dev/null +++ b/doc/html/dir_02c945662023679b89476bd7126bc985.html @@ -0,0 +1,111 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/verifier Directory Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
verifier Directory Reference
+
+
+ +

Verifier functionality.

+ +More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  api.h
 Intel(R) EPID SDK verifier API.
 
file  check_privrl_entry.c
 EpidCheckPrivRlEntry implementation.
 
file  context.c
 Verifier context implementation.
 
file  context.h
 Verifier context interface.
 
file  nrverify.c
 NrVerfy implementation.
 
file  sigs_linked.c
 AreSigsLinked implementation.
 
file  verify.c
 Verify implementation.
 
file  verifybasic.c
 VerifyBasicSig implementation.
 
+

Detailed Description

+

Verifier functionality.

+
+
+ + + + + diff --git a/doc/html/dir_12b90d9c027aaf878a834df729679a56.html b/doc/html/dir_12b90d9c027aaf878a834df729679a56.html new file mode 100644 index 0000000..9031b5c --- /dev/null +++ b/doc/html/dir_12b90d9c027aaf878a834df729679a56.html @@ -0,0 +1,96 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid Directory Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
epid Directory Reference
+
+
+ +

Core Intel® EPID functionality.

+ +More...

+ + + + + + + + + + + +

+Directories

directory  common
 Common code shared between core sub-components.
 
directory  member
 Member functionality.
 
directory  verifier
 Verifier functionality.
 
+

Detailed Description

+

Core Intel® EPID functionality.

+
+
+ + + + + diff --git a/doc/html/dir_512d3e62841a8535b716ec4cf8b9e950.html b/doc/html/dir_512d3e62841a8535b716ec4cf8b9e950.html new file mode 100644 index 0000000..dd82485 --- /dev/null +++ b/doc/html/dir_512d3e62841a8535b716ec4cf8b9e950.html @@ -0,0 +1,123 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/member Directory Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
member Directory Reference
+
+
+ +

Member functionality.

+ +More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  api.h
 Intel(R) EPID SDK member API.
 
file  context.c
 Member context implementation.
 
file  context.h
 Member context interface.
 
file  decompress_privkey.c
 EpidDecompressPrivKey implementation.
 
file  get_sigsize.c
 EpidGetSigSize implementation.
 
file  nr_prove.c
 EpidNrProve implementation.
 
file  presig.c
 EpidComputePreSig implementation.
 
file  privkey.c
 Private key implementation.
 
file  privkey.h
 Private key private interface.
 
file  request_join.c
 EpidRequestJoin implementation.
 
file  sign.c
 EpidSign implementation.
 
file  signbasic.c
 EpidSignBasic implementation.
 
+

Detailed Description

+

Member functionality.

+
+
+ + + + + diff --git a/doc/html/dir_f169ebf8da29290a918fa4b3f7151050.html b/doc/html/dir_f169ebf8da29290a918fa4b3f7151050.html new file mode 100644 index 0000000..7a85522 --- /dev/null +++ b/doc/html/dir_f169ebf8da29290a918fa4b3f7151050.html @@ -0,0 +1,132 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/math Directory Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
math Directory Reference
+
+
+ +

Math primitives.

+ +More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  bignum.c
 Big number implementation.
 
file  bignum.h
 Big number interface.
 
file  ecdsa.h
 Ecdsa interface.
 
file  ecdsa_sign.c
 EcdsaSignBuffer implementation.
 
file  ecdsa_verify.c
 EcdsaVerifyBuffer implementation.
 
file  ecgroup.c
 Elliptic curve group implementation.
 
file  ecgroup.h
 Elliptic curve group interface.
 
file  finitefield.c
 Finite field implementation.
 
file  finitefield.h
 Finite field interface.
 
file  hash.h
 Hash primitives.
 
file  pairing.c
 Pairing implementation.
 
file  pairing.h
 Pairing interface.
 
file  printutils.c
 Print helper implementation.
 
file  printutils.h
 Print helper interface.
 
file  sha256.c
 SHA256 implementation.
 
+

Detailed Description

+

Math primitives.

+
+
+ + + + + diff --git a/doc/html/dir_f6bef457d5f671b6e774bfccc16651f6.html b/doc/html/dir_f6bef457d5f671b6e774bfccc16651f6.html new file mode 100644 index 0000000..9ce1d0c --- /dev/null +++ b/doc/html/dir_f6bef457d5f671b6e774bfccc16651f6.html @@ -0,0 +1,156 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common Directory Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
common Directory Reference
+
+
+ +

Common code shared between core sub-components.

+ +More...

+ + + + + +

+Directories

directory  math
 Math primitives.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  bitsupplier.h
 Random data supplier interface.
 
file  commitment.c
 Commitment hash implementation.
 
file  commitment.h
 Commitment hash interface.
 
file  endian_convert.h
 Endianness conversion interface.
 
file  epid2params.c
 Intel(R) EPID 2.0 constant parameters implementation.
 
file  epid2params.h
 Intel(R) EPID 2.0 constant parameters interface.
 
file  epid2params_ate.inc
 Intel(R) EPID 2.0 constant parameters data.
 
file  errors.c
 Error reporting implementation.
 
file  errors.h
 Error reporting.
 
file  file_parser.c
 Implementation of issuer material file parsing utilities.
 
file  file_parser.h
 Epid issuer material parsing utilities.
 
file  grouppubkey.c
 Group public key implementation.
 
file  grouppubkey.h
 Group public key interface.
 
file  memory.c
 Memory access implementation.
 
file  memory.h
 Memory access interface.
 
file  sigrlvalid.c
 SigRl validity checking implementation.
 
file  sigrlvalid.h
 SigRl validity checking interface.
 
file  stack.c
 Stack container implementation.
 
file  stack.h
 Stack container interface.
 
file  stdtypes.h
 C99 standard data types.
 
file  types.h
 SDK data types.
 
+

Detailed Description

+

Common code shared between core sub-components.

+
+
+ + + + + diff --git a/doc/html/doc.png b/doc/html/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 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 literal 0 HcmV?d00001 diff --git a/doc/html/dynsections.js b/doc/html/dynsections.js new file mode 100644 index 0000000..85e1836 --- /dev/null +++ b/doc/html/dynsections.js @@ -0,0 +1,97 @@ +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 + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/math/ecdsa.h File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
ecdsa.h File Reference
+
+
+ +

Ecdsa interface. +More...

+
#include <stddef.h>
+#include "epid/common/errors.h"
+#include "epid/common/types.h"
+#include "epid/common/bitsupplier.h"
+
+ + + + + + + +

+Functions

EpidStatus EcdsaVerifyBuffer (void const *buf, size_t buf_len, EcdsaPublicKey const *pubkey, EcdsaSignature const *sig)
 Verifies authenticity of a digital signature over a buffer. More...
 
EpidStatus EcdsaSignBuffer (void const *buf, size_t buf_len, EcdsaPrivateKey const *privkey, BitSupplier rnd_func, void *rnd_param, EcdsaSignature *sig)
 Creates ECDSA signature of buffer. More...
 
+

Detailed Description

+

Ecdsa interface.

+
+
+ + + + + diff --git a/doc/html/ecdsa__sign_8c.html b/doc/html/ecdsa__sign_8c.html new file mode 100644 index 0000000..a94a4c2 --- /dev/null +++ b/doc/html/ecdsa__sign_8c.html @@ -0,0 +1,105 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/math/ecdsa_sign.c File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
ecdsa_sign.c File Reference
+
+
+ +

EcdsaSignBuffer implementation. +More...

+
#include "epid/common/math/ecdsa.h"
+#include "epid/common/math/bignum.h"
+#include "epid/common/math/bignum-internal.h"
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/memory.h"
+#include "ext/ipp/include/ippcp.h"
+
+ + + + +

+Macros

+#define EPHKEYGEN_WATCHDOG   (10)
 The number of attempts to generate ephemeral key pair.
 
+ + + + +

+Functions

EpidStatus EcdsaSignBuffer (void const *buf, size_t buf_len, EcdsaPrivateKey const *privkey, BitSupplier rnd_func, void *rnd_param, EcdsaSignature *sig)
 Creates ECDSA signature of buffer. More...
 
+

Detailed Description

+

EcdsaSignBuffer implementation.

+
+
+ + + + + diff --git a/doc/html/ecdsa__verify_8c.html b/doc/html/ecdsa__verify_8c.html new file mode 100644 index 0000000..bb97f4f --- /dev/null +++ b/doc/html/ecdsa__verify_8c.html @@ -0,0 +1,133 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/math/ecdsa_verify.c File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
ecdsa_verify.c File Reference
+
+
+ +

EcdsaVerifyBuffer implementation. +More...

+
#include "epid/common/math/ecdsa.h"
+#include "epid/common/math/bignum.h"
+#include "epid/common/math/bignum-internal.h"
+#include "epid/common/memory.h"
+#include "ext/ipp/include/ippcp.h"
+
+ + + + +

+Macros

#define BREAK_ON_IPP_ERROR(sts, ret)
 Handle Ipp Errors with Break. More...
 
+ + + + +

+Functions

EpidStatus EcdsaVerifyBuffer (void const *buf, size_t buf_len, EcdsaPublicKey const *pubkey, EcdsaSignature const *sig)
 Verifies authenticity of a digital signature over a buffer. More...
 
+

Detailed Description

+

EcdsaVerifyBuffer implementation.

+

Macro Definition Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
#define BREAK_ON_IPP_ERROR( sts,
 ret 
)
+
+Value:
{ \
IppStatus temp_sts = (sts); \
if (ippStsNoErr != temp_sts) { \
(ret) = kEpidMathErr; \
break; \
} \
}
internal math error
Definition: errors.h:53
+
+

Handle Ipp Errors with Break.

+ +
+
+
+
+ + + + + diff --git a/doc/html/ecgroup_8c.html b/doc/html/ecgroup_8c.html new file mode 100644 index 0000000..a59852b --- /dev/null +++ b/doc/html/ecgroup_8c.html @@ -0,0 +1,222 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/math/ecgroup.c File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
ecgroup.c File Reference
+
+
+ +

Elliptic curve group implementation. +More...

+
#include <string.h>
+#include "epid/common/math/bignum-internal.h"
+#include "epid/common/math/ecgroup-internal.h"
+#include "epid/common/math/ecgroup.h"
+#include "epid/common/math/finitefield-internal.h"
+#include "epid/common/memory.h"
+#include "ext/ipp/include/ippcp.h"
+#include "ext/ipp/include/ippcpepid.h"
+
+ + + + +

+Macros

+#define EPID_ECHASH_WATCHDOG   (50)
 The number of attempts to hash a message to an element.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

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)
 Constructs a new EcGroup. More...
 
void DeleteEcGroup (EcGroup **g)
 Deletes a previously allocated EcGroup. More...
 
EpidStatus NewEcPoint (EcGroup const *g, EcPoint **p)
 Creates a new EcPoint. More...
 
void DeleteEcPoint (EcPoint **p)
 Deletes a previously allocated EcPoint. More...
 
EpidStatus eccontains (EcGroup *g, void const *p_str, size_t strlen, EcPoint *p, bool *in_group)
 Check and initialize element if it is in elliptic curve group. More...
 
EpidStatus ReadEcPoint (EcGroup *g, void const *p_str, size_t strlen, EcPoint *p)
 Deserializes an EcPoint from a string. More...
 
EpidStatus WriteEcPoint (EcGroup *g, EcPoint const *p, void *p_str, size_t strlen)
 Serializes an EcPoint to a string. More...
 
EpidStatus EcMul (EcGroup *g, EcPoint const *a, EcPoint const *b, EcPoint *r)
 Multiplies two elements in an elliptic curve group. More...
 
EpidStatus EcExp (EcGroup *g, EcPoint const *a, BigNumStr const *b, EcPoint *r)
 Raises a point in an elliptic curve group to a power. More...
 
EpidStatus EcSscmExp (EcGroup *g, EcPoint const *a, BigNumStr const *b, EcPoint *r)
 Software side-channel mitigated implementation of EcExp. More...
 
EpidStatus EcMultiExp (EcGroup *g, EcPoint const **a, BigNumStr const **b, size_t m, EcPoint *r)
 Multi-exponentiates elements in elliptic curve group. More...
 
EpidStatus EcSscmMultiExp (EcGroup *g, EcPoint const **a, BigNumStr const **b, size_t m, EcPoint *r)
 Software side-channel mitigated implementation of EcMultiExp. More...
 
EpidStatus EcGetRandom (EcGroup *g, BitSupplier rnd_func, void *rnd_func_param, EcPoint *r)
 Generates a random element from an elliptic curve group. More...
 
EpidStatus EcInGroup (EcGroup *g, void const *p_str, size_t strlen, bool *in_group)
 Checks if a point is in an elliptic curve group. More...
 
EpidStatus EcHash (EcGroup *g, void const *msg, size_t msg_len, HashAlg hash_alg, EcPoint *r)
 Hashes an arbitrary message to an element in an elliptic curve group. More...
 
EpidStatus EcMakePoint (EcGroup *g, FfElement const *x, EcPoint *r)
 Sets an EcPoint variable to a point on a curve. More...
 
EpidStatus EcInverse (EcGroup *g, EcPoint const *p, EcPoint *r)
 Computes the additive inverse of an EcPoint. More...
 
EpidStatus EcIsEqual (EcGroup *g, EcPoint const *a, EcPoint const *b, bool *is_equal)
 Checks if two EcPoints are equal. More...
 
EpidStatus EcIsIdentity (EcGroup *g, EcPoint const *p, bool *is_identity)
 Checks if an EcPoint is the identity element. More...
 
+

Detailed Description

+

Elliptic curve group implementation.

+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus eccontains (EcGroupg,
void const * p_str,
size_t strlen,
EcPointp,
boolin_group 
)
+
+ +

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.

+
Parameters
+ + + + + + +
[in]gThe eliptic curve group in which to perform the check
[in]p_strSerialized eliptic curve group element to check
[in]strlenThe size of p_str in bytes.
[out]pDeserialized value of p_str
[out]in_groupResult of the check
+
+
+
Returns
EpidStatus
+
See also
NewEcPoint
+ +
+
+
+
+ + + + + diff --git a/doc/html/ecgroup_8h.html b/doc/html/ecgroup_8h.html new file mode 100644 index 0000000..ebb7d5d --- /dev/null +++ b/doc/html/ecgroup_8h.html @@ -0,0 +1,159 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/math/ecgroup.h File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
ecgroup.h File Reference
+
+
+ +

Elliptic curve group interface. +More...

+ + + + + + + + +

+Typedefs

+typedef struct EcGroup EcGroup
 Elliptic curve group over finite field.
 
+typedef struct EcPoint EcPoint
 Point on elliptic curve over finite field.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

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)
 Constructs a new EcGroup. More...
 
void DeleteEcGroup (EcGroup **g)
 Deletes a previously allocated EcGroup. More...
 
EpidStatus NewEcPoint (EcGroup const *g, EcPoint **p)
 Creates a new EcPoint. More...
 
void DeleteEcPoint (EcPoint **p)
 Deletes a previously allocated EcPoint. More...
 
EpidStatus ReadEcPoint (EcGroup *g, void const *p_str, size_t strlen, EcPoint *p)
 Deserializes an EcPoint from a string. More...
 
EpidStatus WriteEcPoint (EcGroup *g, EcPoint const *p, void *p_str, size_t strlen)
 Serializes an EcPoint to a string. More...
 
EpidStatus EcMul (EcGroup *g, EcPoint const *a, EcPoint const *b, EcPoint *r)
 Multiplies two elements in an elliptic curve group. More...
 
EpidStatus EcExp (EcGroup *g, EcPoint const *a, BigNumStr const *b, EcPoint *r)
 Raises a point in an elliptic curve group to a power. More...
 
EpidStatus EcSscmExp (EcGroup *g, EcPoint const *a, BigNumStr const *b, EcPoint *r)
 Software side-channel mitigated implementation of EcExp. More...
 
EpidStatus EcMultiExp (EcGroup *g, EcPoint const **a, BigNumStr const **b, size_t m, EcPoint *r)
 Multi-exponentiates elements in elliptic curve group. More...
 
EpidStatus EcSscmMultiExp (EcGroup *g, EcPoint const **a, BigNumStr const **b, size_t m, EcPoint *r)
 Software side-channel mitigated implementation of EcMultiExp. More...
 
EpidStatus EcGetRandom (EcGroup *g, BitSupplier rnd_func, void *rnd_func_param, EcPoint *r)
 Generates a random element from an elliptic curve group. More...
 
EpidStatus EcInGroup (EcGroup *g, void const *p_str, size_t strlen, bool *in_group)
 Checks if a point is in an elliptic curve group. More...
 
EpidStatus EcHash (EcGroup *g, void const *msg, size_t msg_len, HashAlg hash_alg, EcPoint *r)
 Hashes an arbitrary message to an element in an elliptic curve group. More...
 
EpidStatus EcMakePoint (EcGroup *g, FfElement const *x, EcPoint *r)
 Sets an EcPoint variable to a point on a curve. More...
 
EpidStatus EcInverse (EcGroup *g, EcPoint const *p, EcPoint *r)
 Computes the additive inverse of an EcPoint. More...
 
EpidStatus EcIsEqual (EcGroup *g, EcPoint const *a, EcPoint const *b, bool *is_equal)
 Checks if two EcPoints are equal. More...
 
EpidStatus EcIsIdentity (EcGroup *g, EcPoint const *p, bool *is_identity)
 Checks if an EcPoint is the identity element. More...
 
+

Detailed Description

+

Elliptic curve group interface.

+
+
+ + + + + diff --git a/doc/html/endian__convert_8h.html b/doc/html/endian__convert_8h.html new file mode 100644 index 0000000..5f089eb --- /dev/null +++ b/doc/html/endian__convert_8h.html @@ -0,0 +1,92 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/endian_convert.h File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
endian_convert.h File Reference
+
+
+ +

Endianness conversion interface. +More...

+
#include <stdint.h>
+
+ + + + +

+Macros

#define ntohl(u32)
 Macros to transform oct str 32 into uint_32. More...
 
+

Detailed Description

+

Endianness conversion interface.

+
+
+ + + + + diff --git a/doc/html/epid2params_8c.html b/doc/html/epid2params_8c.html new file mode 100644 index 0000000..8d24884 --- /dev/null +++ b/doc/html/epid2params_8c.html @@ -0,0 +1,98 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/epid2params.c File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
epid2params.c File Reference
+
+
+ +

Intel(R) EPID 2.0 constant parameters implementation. +More...

+ + + + + + + + +

+Functions

+EpidStatus NewFq6 (Epid2Params const *param, FiniteField *Fq2, FfElement *xi, FiniteField **Fq6)
 create a new Finite Field Fq6
 
void DeleteEpid2Params (Epid2Params_ **epid_params)
 Deallocates storage for internal representation of Epid2Params. More...
 
+

Detailed Description

+

Intel(R) EPID 2.0 constant parameters implementation.

+
+
+ + + + + diff --git a/doc/html/epid2params_8h.html b/doc/html/epid2params_8h.html new file mode 100644 index 0000000..58c8eb3 --- /dev/null +++ b/doc/html/epid2params_8h.html @@ -0,0 +1,105 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/epid2params.h File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
epid2params.h File Reference
+
+
+ +

Intel(R) EPID 2.0 constant parameters interface. +More...

+ + + + + +

+Data Structures

struct  Epid2Params_
 Internal representation of Epid2Params. More...
 
+ + + + + + + +

+Functions

EpidStatus CreateEpid2Params (Epid2Params_ **params)
 Constructs the internal representation of Epid2Params. More...
 
void DeleteEpid2Params (Epid2Params_ **epid_params)
 Deallocates storage for internal representation of Epid2Params. More...
 
+

Detailed Description

+

Intel(R) EPID 2.0 constant parameters interface.

+
+
+ + + + + diff --git a/doc/html/epid2params__ate_8inc.html b/doc/html/epid2params__ate_8inc.html new file mode 100644 index 0000000..b7168ea --- /dev/null +++ b/doc/html/epid2params__ate_8inc.html @@ -0,0 +1,82 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/epid2params_ate.inc File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
epid2params_ate.inc File Reference
+
+
+ +

Intel(R) EPID 2.0 constant parameters data. +More...

+

Detailed Description

+

Intel(R) EPID 2.0 constant parameters data.

+
+
+ + + + + diff --git a/doc/html/epid__overview_8dox.html b/doc/html/epid__overview_8dox.html new file mode 100644 index 0000000..eefba22 --- /dev/null +++ b/doc/html/epid__overview_8dox.html @@ -0,0 +1,82 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: doc/docsrc/epid_overview.dox File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
doc/docsrc/epid_overview.dox File Reference
+
+
+ +

This file is used by Doxygen to generate documentation. +More...

+

Detailed Description

+

This file is used by Doxygen to generate documentation.

+
+
+ + + + + diff --git a/doc/html/epid_diagram_high_level_interaction.png b/doc/html/epid_diagram_high_level_interaction.png new file mode 100644 index 0000000000000000000000000000000000000000..1013eb05f21ed8d32711372cea3756ffdbe79830 GIT binary patch literal 25513 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 T4qF)*7#KWV{an^LB{Ts5Oqk`} literal 0 HcmV?d00001 diff --git a/doc/html/epid_diagram_high_level_use_case.png b/doc/html/epid_diagram_high_level_use_case.png new file mode 100644 index 0000000000000000000000000000000000000000..acc63747281f6b6233c1a641044c5a6face6fff7 GIT binary patch literal 16041 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%0DX8&wt=*?h0*b3jDzA5Gg|7ItNg&YcdvU>{B>Nj0 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 literal 0 HcmV?d00001 diff --git a/doc/html/epid_diagram_member_high_level.png b/doc/html/epid_diagram_member_high_level.png new file mode 100644 index 0000000000000000000000000000000000000000..58d784f413c02915a6679d3160e44a3137b3aa9b GIT binary patch literal 8319 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 G5}E+50~o&m literal 0 HcmV?d00001 diff --git a/doc/html/epid_diagram_verifier_high_level.png b/doc/html/epid_diagram_verifier_high_level.png new file mode 100644 index 0000000000000000000000000000000000000000..bb92560c91d975240f140f4676730f8210a3a77d GIT binary patch literal 8897 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 II;Vst0Adb*%m4rY literal 0 HcmV?d00001 diff --git a/doc/html/epidstyle.css b/doc/html/epidstyle.css new file mode 100644 index 0000000..0ad7ff8 --- /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; +} \ No newline at end of file diff --git a/doc/html/errors_8c.html b/doc/html/errors_8c.html new file mode 100644 index 0000000..ce82948 --- /dev/null +++ b/doc/html/errors_8c.html @@ -0,0 +1,101 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/errors.c File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
errors.c File Reference
+
+
+ +

Error reporting implementation. +More...

+
#include <stddef.h>
+#include "epid/common/stdtypes.h"
+#include "epid/common/errors.h"
+
+ + + + +

+Data Structures

struct  ErrorTextEntry
 Record mapping status code to string. More...
 
+ + + + +

+Functions

char const * EpidStatusToString (EpidStatus e)
 Returns string representation of error code. More...
 
+

Detailed Description

+

Error reporting implementation.

+
+
+ + + + + diff --git a/doc/html/errors_8h.html b/doc/html/errors_8h.html new file mode 100644 index 0000000..7b8a7f8 --- /dev/null +++ b/doc/html/errors_8h.html @@ -0,0 +1,122 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/errors.h File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
errors.h File Reference
+
+
+ +

Error reporting. +More...

+ + + + + +

+Enumerations

enum  EpidStatus {
+  kEpidNoErr = 0, +kEpidSigValid = 0, +kEpidSigInvalid = 1, +kEpidSigRevokedinGroupRl = 2, +
+  kEpidSigRevokedinPrivRl = 3, +kEpidSigRevokedinSigRl = 4, +kEpidSigRevokedinVerifierRl = 5, +kEpidErr = -999, +
+  kEpidNotImpl, +kEpidBadArgErr, +kEpidNoMemErr, +kEpidMemAllocErr, +
+  kEpidMathErr, +kEpidDivByZeroErr, +kEpidUnderflowErr, +kEpidHashAlgorithmNotSupported, +
+  kEpidRandMaxIterErr, +kEpidDuplicateErr +
+ }
 Return status for SDK functions. More...
 
+ + + + +

+Functions

char const * EpidStatusToString (EpidStatus e)
 Returns string representation of error code. More...
 
+

Detailed Description

+

Error reporting.

+
+
+ + + + + diff --git a/doc/html/examples.html b/doc/html/examples.html new file mode 100644 index 0000000..f2de4e6 --- /dev/null +++ b/doc/html/examples.html @@ -0,0 +1,82 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Examples + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
Examples
+
+
+
Here is a list of all examples:
+
+
+ + + + + diff --git a/doc/html/examples.js b/doc/html/examples.js new file mode 100644 index 0000000..cdfa353 --- /dev/null +++ b/doc/html/examples.js @@ -0,0 +1,5 @@ +var examples = +[ + [ "signmsg.c", "signmsg_8c-example.html", null ], + [ "verifysig.c", "verifysig_8c-example.html", null ] +]; \ No newline at end of file diff --git a/doc/html/examples_8dox.html b/doc/html/examples_8dox.html new file mode 100644 index 0000000..7f8829a --- /dev/null +++ b/doc/html/examples_8dox.html @@ -0,0 +1,82 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: doc/docsrc/examples.dox File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
doc/docsrc/examples.dox File Reference
+
+
+ +

This file is used by Doxygen to generate documentation. +More...

+

Detailed Description

+

This file is used by Doxygen to generate documentation.

+
+
+ + + + + diff --git a/doc/html/file__parser_8c.html b/doc/html/file__parser_8c.html new file mode 100644 index 0000000..befa225 --- /dev/null +++ b/doc/html/file__parser_8c.html @@ -0,0 +1,118 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/file_parser.c File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
file_parser.c File Reference
+
+
+ +

Implementation of issuer material file parsing utilities. +More...

+
#include "epid/common/file_parser.h"
+#include <string.h>
+#include "epid/common/math/ecdsa.h"
+#include "epid/common/memory.h"
+
+ + + + +

+Data Structures

struct  EpidGroupPubKeyCertificate
 Intel(R) EPID 2.0 Group Public Key binary format. More...
 
+ + + + + + + + + + + + + +

+Functions

EpidStatus EpidParseGroupPubKeyFile (void const *buf, size_t len, EpidCaCertificate const *cert, GroupPubKey *pubkey)
 Extracts group public key from buffer in issuer binary format. More...
 
EpidStatus EpidParsePrivRlFile (void const *buf, size_t len, EpidCaCertificate const *cert, PrivRl *rl, size_t *rl_len)
 Extracts private key revocation list from buffer in issuer binary format. More...
 
EpidStatus EpidParseSigRlFile (void const *buf, size_t len, EpidCaCertificate const *cert, SigRl *rl, size_t *rl_len)
 Extracts signature revocation list from buffer in issuer binary format. More...
 
EpidStatus EpidParseGroupRlFile (void const *buf, size_t len, EpidCaCertificate const *cert, GroupRl *rl, size_t *rl_len)
 Extracts group revocation list from buffer in issuer binary format. More...
 
+ + + + +

+Variables

const OctStr16 kEpidFileTypeCode [kNumFileTypes]
 Encoding of issuer material file types. More...
 
+

Detailed Description

+

Implementation of issuer material file parsing utilities.

+
+
+ + + + + diff --git a/doc/html/file__parser_8h.html b/doc/html/file__parser_8h.html new file mode 100644 index 0000000..b87ad4c --- /dev/null +++ b/doc/html/file__parser_8h.html @@ -0,0 +1,141 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/file_parser.h File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
file_parser.h File Reference
+
+
+ +

Epid issuer material parsing utilities. +More...

+
#include <stddef.h>
+#include "epid/common/types.h"
+#include "epid/common/errors.h"
+
+ + + + + + + +

+Data Structures

struct  EpidFileHeader
 Intel(R) EPID binary file header. More...
 
struct  EpidCaCertificate
 IoT CA Certificate binary format. More...
 
+ + + + +

+Enumerations

enum  EpidFileType {
+  kIssuingCaPubKeyFile, +kGroupPubKeyFile, +kPrivRlFile, +kSigRlFile, +
+  kGroupRlFile, +kPrivRlRequestFile, +kSigRlRequestFile, +kGroupRlRequestFile, +
+  kNumFileTypes +
+ }
 Recognized Intel(R) EPID file types. More...
 
+ + + + + + + + + + + + + +

+Functions

EpidStatus EpidParseGroupPubKeyFile (void const *buf, size_t len, EpidCaCertificate const *cert, GroupPubKey *pubkey)
 Extracts group public key from buffer in issuer binary format. More...
 
EpidStatus EpidParsePrivRlFile (void const *buf, size_t len, EpidCaCertificate const *cert, PrivRl *rl, size_t *rl_len)
 Extracts private key revocation list from buffer in issuer binary format. More...
 
EpidStatus EpidParseSigRlFile (void const *buf, size_t len, EpidCaCertificate const *cert, SigRl *rl, size_t *rl_len)
 Extracts signature revocation list from buffer in issuer binary format. More...
 
EpidStatus EpidParseGroupRlFile (void const *buf, size_t len, EpidCaCertificate const *cert, GroupRl *rl, size_t *rl_len)
 Extracts group revocation list from buffer in issuer binary format. More...
 
+ + + + +

+Variables

+const OctStr16 kEpidFileTypeCode [kNumFileTypes]
 Encoding of issuer material file types.
 
+

Detailed Description

+

Epid issuer material parsing utilities.

+
+
+ + + + + diff --git a/doc/html/files.html b/doc/html/files.html new file mode 100644 index 0000000..9da5d54 --- /dev/null +++ b/doc/html/files.html @@ -0,0 +1,141 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: File List + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+
[detail level 1234]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  epidCore Intel® EPID functionality
  commonCommon code shared between core sub-components
  mathMath primitives
 bignum.cBig number implementation
 bignum.hBig number interface
 ecdsa.hEcdsa interface
 ecdsa_sign.cEcdsaSignBuffer implementation
 ecdsa_verify.cEcdsaVerifyBuffer implementation
 ecgroup.cElliptic curve group implementation
 ecgroup.hElliptic curve group interface
 finitefield.cFinite field implementation
 finitefield.hFinite field interface
 hash.hHash primitives
 pairing.cPairing implementation
 pairing.hPairing interface
 printutils.cPrint helper implementation
 printutils.hPrint helper interface
 sha256.cSHA256 implementation
 bitsupplier.hRandom data supplier interface
 commitment.cCommitment hash implementation
 commitment.hCommitment hash interface
 endian_convert.hEndianness conversion interface
 epid2params.cIntel(R) EPID 2.0 constant parameters implementation
 epid2params.hIntel(R) EPID 2.0 constant parameters interface
 epid2params_ate.incIntel(R) EPID 2.0 constant parameters data
 errors.cError reporting implementation
 errors.hError reporting
 file_parser.cImplementation of issuer material file parsing utilities
 file_parser.hEpid issuer material parsing utilities
 grouppubkey.cGroup public key implementation
 grouppubkey.hGroup public key interface
 memory.cMemory access implementation
 memory.hMemory access interface
 sigrlvalid.cSigRl validity checking implementation
 sigrlvalid.hSigRl validity checking interface
 stack.cStack container implementation
 stack.hStack container interface
 stdtypes.hC99 standard data types
 types.hSDK data types
  memberMember functionality
 api.hIntel(R) EPID SDK member API
 context.cMember context implementation
 context.hMember context interface
 decompress_privkey.cEpidDecompressPrivKey implementation
 get_sigsize.cEpidGetSigSize implementation
 nr_prove.cEpidNrProve implementation
 presig.cEpidComputePreSig implementation
 privkey.cPrivate key implementation
 privkey.hPrivate key private interface
 request_join.cEpidRequestJoin implementation
 sign.cEpidSign implementation
 signbasic.cEpidSignBasic implementation
  verifierVerifier functionality
 api.hIntel(R) EPID SDK verifier API
 check_privrl_entry.cEpidCheckPrivRlEntry implementation
 context.cVerifier context implementation
 context.hVerifier context interface
 nrverify.cNrVerfy implementation
 sigs_linked.cAreSigsLinked implementation
 verify.cVerify implementation
 verifybasic.cVerifyBasicSig implementation
+
+
+
+ + + + + diff --git a/doc/html/finitefield_8c.html b/doc/html/finitefield_8c.html new file mode 100644 index 0000000..da69752 --- /dev/null +++ b/doc/html/finitefield_8c.html @@ -0,0 +1,162 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/math/finitefield.c File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
finitefield.c File Reference
+
+
+ +

Finite field implementation. +More...

+
#include <limits.h>
+#include <string.h>
+#include "epid/common/math/finitefield.h"
+#include "epid/common/math/bignum-internal.h"
+#include "epid/common/math/finitefield-internal.h"
+#include "epid/common/memory.h"
+#include "ext/ipp/include/ippcp.h"
+#include "ext/ipp/include/ippcpepid.h"
+
+ + + + +

+Macros

+#define RNG_WATCHDOG   (10)
 Number of tries for RNG.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

+EpidStatus InitFiniteFieldFromIpp (IppsGFpState *ipp_ff, FiniteField *ff)
 Initializes a FiniteField structure.
 
EpidStatus NewFiniteField (BigNumStr const *prime, FiniteField **ff)
 Creates new finite field. More...
 
EpidStatus NewFiniteFieldViaBinomalExtension (FiniteField const *ground_field, FfElement const *ground_element, int degree, FiniteField **ff)
 Creates a new finite field using binomial extension. More...
 
void DeleteFiniteField (FiniteField **ff)
 Frees a previously allocated FiniteField. More...
 
EpidStatus NewFfElement (FiniteField const *ff, FfElement **new_ff_elem)
 Creates a new finite field element. More...
 
void DeleteFfElement (FfElement **ff_elem)
 Frees a previously allocated FfElement. More...
 
EpidStatus ReadFfElement (FiniteField *ff, void const *ff_elem_str, size_t strlen, FfElement *ff_elem)
 Deserializes a FfElement from a string. More...
 
EpidStatus WriteFfElement (FiniteField *ff, FfElement const *ff_elem, void *ff_elem_str, size_t strlen)
 Serializes a finite field element to a string. More...
 
EpidStatus FfNeg (FiniteField *ff, FfElement const *a, FfElement *r)
 Calculates the additive inverse of a finite field element. More...
 
EpidStatus FfInv (FiniteField *ff, FfElement const *a, FfElement *r)
 Calculates the multiplicative inverse of a finite field element. More...
 
EpidStatus FfAdd (FiniteField *ff, FfElement const *a, FfElement const *b, FfElement *r)
 Adds two finite field elements. More...
 
EpidStatus FfMul (FiniteField *ff, FfElement const *a, FfElement const *b, FfElement *r)
 Multiplies two finite field elements. More...
 
EpidStatus FfIsZero (FiniteField *ff, FfElement const *a, bool *is_zero)
 Checks if given finite field element is the additive identity (zero). More...
 
EpidStatus FfExp (FiniteField *ff, FfElement const *a, BigNum const *b, FfElement *r)
 Raises an element of a finite field to a power. More...
 
EpidStatus FfMultiExp (FiniteField *ff, FfElement const **p, BigNumStr const **b, size_t m, FfElement *r)
 Multi-exponentiates finite field elements. More...
 
EpidStatus FfSscmMultiExp (FiniteField *ff, FfElement const **p, BigNumStr const **b, size_t m, FfElement *r)
 Software side-channel mitigated implementation of FfMultiExp. More...
 
EpidStatus FfIsEqual (FiniteField *ff, FfElement const *a, FfElement const *b, bool *is_equal)
 Checks if two finite field elements are equal. More...
 
EpidStatus FfHash (FiniteField *ff, void const *msg, size_t msg_len, HashAlg hash_alg, FfElement *r)
 Hashes an arbitrary message to an element in a finite field. More...
 
EpidStatus FfGetRandom (FiniteField *ff, BigNumStr const *low_bound, BitSupplier rnd_func, void *rnd_param, FfElement *r)
 Generate random finite field element. More...
 
+

Detailed Description

+

Finite field implementation.

+
+
+ + + + + diff --git a/doc/html/finitefield_8h.html b/doc/html/finitefield_8h.html new file mode 100644 index 0000000..b966a52 --- /dev/null +++ b/doc/html/finitefield_8h.html @@ -0,0 +1,159 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/math/finitefield.h File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
finitefield.h File Reference
+
+
+ +

Finite field interface. +More...

+ + + + + + + + +

+Typedefs

+typedef struct FiniteField FiniteField
 A finite field.
 
+typedef struct FfElement FfElement
 An element in a finite field.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

EpidStatus NewFiniteField (BigNumStr const *prime, FiniteField **ff)
 Creates new finite field. More...
 
EpidStatus NewFiniteFieldViaBinomalExtension (FiniteField const *ground_field, FfElement const *ground_element, int degree, FiniteField **ff)
 Creates a new finite field using binomial extension. More...
 
void DeleteFiniteField (FiniteField **ff)
 Frees a previously allocated FiniteField. More...
 
EpidStatus NewFfElement (FiniteField const *ff, FfElement **new_ff_elem)
 Creates a new finite field element. More...
 
void DeleteFfElement (FfElement **ff_elem)
 Frees a previously allocated FfElement. More...
 
EpidStatus ReadFfElement (FiniteField *ff, void const *ff_elem_str, size_t strlen, FfElement *ff_elem)
 Deserializes a FfElement from a string. More...
 
EpidStatus WriteFfElement (FiniteField *ff, FfElement const *ff_elem, void *ff_elem_str, size_t strlen)
 Serializes a finite field element to a string. More...
 
EpidStatus FfNeg (FiniteField *ff, FfElement const *a, FfElement *r)
 Calculates the additive inverse of a finite field element. More...
 
EpidStatus FfInv (FiniteField *ff, FfElement const *a, FfElement *r)
 Calculates the multiplicative inverse of a finite field element. More...
 
EpidStatus FfAdd (FiniteField *ff, FfElement const *a, FfElement const *b, FfElement *r)
 Adds two finite field elements. More...
 
EpidStatus FfMul (FiniteField *ff, FfElement const *a, FfElement const *b, FfElement *r)
 Multiplies two finite field elements. More...
 
EpidStatus FfIsZero (FiniteField *ff, FfElement const *a, bool *is_zero)
 Checks if given finite field element is the additive identity (zero). More...
 
EpidStatus FfExp (FiniteField *ff, FfElement const *a, BigNum const *b, FfElement *r)
 Raises an element of a finite field to a power. More...
 
EpidStatus FfMultiExp (FiniteField *ff, FfElement const **a, BigNumStr const **b, size_t m, FfElement *r)
 Multi-exponentiates finite field elements. More...
 
EpidStatus FfSscmMultiExp (FiniteField *ff, FfElement const **a, BigNumStr const **b, size_t m, FfElement *r)
 Software side-channel mitigated implementation of FfMultiExp. More...
 
EpidStatus FfIsEqual (FiniteField *ff, FfElement const *a, FfElement const *b, bool *is_equal)
 Checks if two finite field elements are equal. More...
 
EpidStatus FfHash (FiniteField *ff, void const *msg, size_t msg_len, HashAlg hash_alg, FfElement *r)
 Hashes an arbitrary message to an element in a finite field. More...
 
EpidStatus FfGetRandom (FiniteField *ff, BigNumStr const *low_bound, BitSupplier rnd_func, void *rnd_param, FfElement *r)
 Generate random finite field element. More...
 
+

Detailed Description

+

Finite field interface.

+
+
+ + + + + diff --git a/doc/html/folderclosed.png b/doc/html/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmeAS@N?(olHy`uVBq!ia0y~yV31&7U=ZVAV_;yoRU6a6z`&&M>Eakt!T2`T*Z+!x zMBS}lr8g$z6vTdG-mg6SXly{_1Xt&d7|Wl`dnzy9Pq=pE|AWT=2ToRee#E%QSwT&} zw(!CcfnN5-jMK}ap3g1YW}MqN;YM?N**u@$e$Q*~eXqSYcW;!V0E0u`21W({Cw>K7 z43jE8|MTAP@uPG@#ht7v8!U=1GBr$AnA|X@KVDjHPxPU;&z8S;VPH^inkrIRnX3I` z&u?yXWu_v(`8n_ZaAa%o>@&EqCO&0#yvBo%ho^0P@TJO@;bXpYv#0mbC`7D>Bj;!>6saJ1(pm;Cd_1Xbv?Ic z#ko@xl@^pPotwwrpc15HU%gYzW`sHkOzmi8Pog(+QZT$66JI>~%l+tpe1-+|W z3a1oqiCMGy(oB}bX$(CRS33T0;8(h`b-~P6^Irrku4R-^c70GKQ~g`dB2(dA!RA*Q zjxOac%h+96Y+kKNc3mc>!t0T8>WCQ6lwLinn>_A)y37m-Jw8o;_o*-HJYuuNS;lkK zUhA93L!wePX4YEUz4&s!sp`75_x0r#C1MObOZvD9Wu}N(m6rW4n|gQlnoT#$Tp#6C zxA<;%i%8#dCM`qI%S6a=^nig63;?8SjV}a-AgBgB=|M>s^ eVv+g}?khiKem3!}T*$z{z~JfX=d#Wzp$P!>ZX#j; literal 0 HcmV?d00001 diff --git a/doc/html/folderopen.png b/doc/html/folderopen.png new file mode 100644 index 0000000000000000000000000000000000000000..d6c7f676a3b3ef8c2c307d319dff3c6a604eb227 GIT binary patch literal 597 zcmeAS@N?(olHy`uVBq!ia0y~yV31&7U=ZVAV_;yoRU6a6z`!Kq>Eakt!T2`TKL2un zz<x}AR=$zQt$$#L0c|y{QD>v87z44Pz$Ky??`WF?k30jRI zTVtC-7P`m<+&W@be!jL-)_S3{wL;?l%X9C~|9$uUyLo%E90eE-to3AL$P4~g+hEDy zG5KuOxvwv_QeX{r{3_4-KHC&iIZo;fX=zyIHn>5GeRiZbq% z+IzF7jpyWQ@!2a6L>@0>P*8L~zF(&7O#9A@H`dMK-q6!@#cd};ZK2%KB)-`1O#J3= zw=)=M-b$Ih@Batg7rSZ$(w;277FlgF^Wq_g+F#GUd^EcK=gM@kkH4P!^>{WNJl>rA z{NOIt#cM*lHh6B%l}_IHg>}Z$Jy(v+{d2ojwzB=@_J0=Us`WK=%bBL< zBFgiwcT9c%yGYg{M}^@>!2co-hQvh4*1LSp)K zN>*hF7;(tDIabKCm+7+k%$F><-XmMU6>`K=pDSi*ahmwsz1BQgVVNP#FMch_k4r8% z`e)B?>EFB0C&f-V)UarY4S!qWzpHaLO}>Abc}C^r#eB;x`>lH3{nS3tzge!~;{zR6 z?s;jO&0hL3bo3r^UF;oNdnZoFT6)`!yr@N`_eIu*2AfRhy}0Ie(%X4{+w^W_FT0Ty za^%}CRk^LJ9&ygiTpxDi)ZI_ZXY!o*Db27$^XGqe=7yP{*mrqxID{;yn8Luoz~JfX K=d#Wzp$PzT5g5Y& literal 0 HcmV?d00001 diff --git a/doc/html/functions.html b/doc/html/functions.html new file mode 100644 index 0000000..e284cce --- /dev/null +++ b/doc/html/functions.html @@ -0,0 +1,98 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- a -

+
+
+ + + + + diff --git a/doc/html/functions_b.html b/doc/html/functions_b.html new file mode 100644 index 0000000..a2e5748 --- /dev/null +++ b/doc/html/functions_b.html @@ -0,0 +1,107 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- b -

+
+
+ + + + + diff --git a/doc/html/functions_c.html b/doc/html/functions_c.html new file mode 100644 index 0000000..e373d8a --- /dev/null +++ b/doc/html/functions_c.html @@ -0,0 +1,85 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- c -

+
+
+ + + + + diff --git a/doc/html/functions_d.html b/doc/html/functions_d.html new file mode 100644 index 0000000..48a9295 --- /dev/null +++ b/doc/html/functions_d.html @@ -0,0 +1,90 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- d -

+
+
+ + + + + diff --git a/doc/html/functions_e.html b/doc/html/functions_e.html new file mode 100644 index 0000000..89b95e9 --- /dev/null +++ b/doc/html/functions_e.html @@ -0,0 +1,112 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- e -

+
+
+ + + + + diff --git a/doc/html/functions_f.html b/doc/html/functions_f.html new file mode 100644 index 0000000..72d5595 --- /dev/null +++ b/doc/html/functions_f.html @@ -0,0 +1,100 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- f -

+
+
+ + + + + diff --git a/doc/html/functions_g.html b/doc/html/functions_g.html new file mode 100644 index 0000000..edb3cd4 --- /dev/null +++ b/doc/html/functions_g.html @@ -0,0 +1,122 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- g -

+
+
+ + + + + diff --git a/doc/html/functions_h.html b/doc/html/functions_h.html new file mode 100644 index 0000000..dcb325c --- /dev/null +++ b/doc/html/functions_h.html @@ -0,0 +1,98 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- h -

+
+
+ + + + + diff --git a/doc/html/functions_k.html b/doc/html/functions_k.html new file mode 100644 index 0000000..fdf2abc --- /dev/null +++ b/doc/html/functions_k.html @@ -0,0 +1,95 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- k -

+
+
+ + + + + diff --git a/doc/html/functions_l.html b/doc/html/functions_l.html new file mode 100644 index 0000000..9c72e63 --- /dev/null +++ b/doc/html/functions_l.html @@ -0,0 +1,79 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- l -

+
+
+ + + + + diff --git a/doc/html/functions_m.html b/doc/html/functions_m.html new file mode 100644 index 0000000..8d86dd4 --- /dev/null +++ b/doc/html/functions_m.html @@ -0,0 +1,82 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- m -

+
+
+ + + + + diff --git a/doc/html/functions_n.html b/doc/html/functions_n.html new file mode 100644 index 0000000..23782aa --- /dev/null +++ b/doc/html/functions_n.html @@ -0,0 +1,102 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- n -

+
+
+ + + + + diff --git a/doc/html/functions_p.html b/doc/html/functions_p.html new file mode 100644 index 0000000..8355af1 --- /dev/null +++ b/doc/html/functions_p.html @@ -0,0 +1,105 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- p -

+
+
+ + + + + diff --git a/doc/html/functions_q.html b/doc/html/functions_q.html new file mode 100644 index 0000000..ea64bc3 --- /dev/null +++ b/doc/html/functions_q.html @@ -0,0 +1,80 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- q -

+
+
+ + + + + diff --git a/doc/html/functions_r.html b/doc/html/functions_r.html new file mode 100644 index 0000000..313ae27 --- /dev/null +++ b/doc/html/functions_r.html @@ -0,0 +1,121 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- r -

+
+
+ + + + + diff --git a/doc/html/functions_s.html b/doc/html/functions_s.html new file mode 100644 index 0000000..671de83 --- /dev/null +++ b/doc/html/functions_s.html @@ -0,0 +1,113 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- s -

+
+
+ + + + + diff --git a/doc/html/functions_t.html b/doc/html/functions_t.html new file mode 100644 index 0000000..d845079 --- /dev/null +++ b/doc/html/functions_t.html @@ -0,0 +1,99 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- t -

+
+
+ + + + + diff --git a/doc/html/functions_v.html b/doc/html/functions_v.html new file mode 100644 index 0000000..5903919 --- /dev/null +++ b/doc/html/functions_v.html @@ -0,0 +1,88 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- v -

+
+
+ + + + + diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html new file mode 100644 index 0000000..445df8d --- /dev/null +++ b/doc/html/functions_vars.html @@ -0,0 +1,98 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- a -

+
+
+ + + + + diff --git a/doc/html/functions_vars_b.html b/doc/html/functions_vars_b.html new file mode 100644 index 0000000..d19d237 --- /dev/null +++ b/doc/html/functions_vars_b.html @@ -0,0 +1,107 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- b -

+
+
+ + + + + diff --git a/doc/html/functions_vars_c.html b/doc/html/functions_vars_c.html new file mode 100644 index 0000000..0225552 --- /dev/null +++ b/doc/html/functions_vars_c.html @@ -0,0 +1,85 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- c -

+
+
+ + + + + diff --git a/doc/html/functions_vars_d.html b/doc/html/functions_vars_d.html new file mode 100644 index 0000000..5887dbf --- /dev/null +++ b/doc/html/functions_vars_d.html @@ -0,0 +1,90 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+ +
+ + + + + diff --git a/doc/html/functions_vars_e.html b/doc/html/functions_vars_e.html new file mode 100644 index 0000000..81b785f --- /dev/null +++ b/doc/html/functions_vars_e.html @@ -0,0 +1,112 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- e -

+
+
+ + + + + diff --git a/doc/html/functions_vars_f.html b/doc/html/functions_vars_f.html new file mode 100644 index 0000000..a9cdb55 --- /dev/null +++ b/doc/html/functions_vars_f.html @@ -0,0 +1,100 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- f -

+
+
+ + + + + diff --git a/doc/html/functions_vars_g.html b/doc/html/functions_vars_g.html new file mode 100644 index 0000000..fc37948 --- /dev/null +++ b/doc/html/functions_vars_g.html @@ -0,0 +1,122 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ + + + + + + diff --git a/doc/html/functions_vars_h.html b/doc/html/functions_vars_h.html new file mode 100644 index 0000000..53e982c --- /dev/null +++ b/doc/html/functions_vars_h.html @@ -0,0 +1,98 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ + + + + + + diff --git a/doc/html/functions_vars_k.html b/doc/html/functions_vars_k.html new file mode 100644 index 0000000..84e55cd --- /dev/null +++ b/doc/html/functions_vars_k.html @@ -0,0 +1,95 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- k -

+
+
+ + + + + diff --git a/doc/html/functions_vars_l.html b/doc/html/functions_vars_l.html new file mode 100644 index 0000000..b5eef3e --- /dev/null +++ b/doc/html/functions_vars_l.html @@ -0,0 +1,79 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- l -

+
+
+ + + + + diff --git a/doc/html/functions_vars_m.html b/doc/html/functions_vars_m.html new file mode 100644 index 0000000..58b6aa8 --- /dev/null +++ b/doc/html/functions_vars_m.html @@ -0,0 +1,82 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- m -

+
+
+ + + + + diff --git a/doc/html/functions_vars_n.html b/doc/html/functions_vars_n.html new file mode 100644 index 0000000..b154f66 --- /dev/null +++ b/doc/html/functions_vars_n.html @@ -0,0 +1,102 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- n -

+
+
+ + + + + diff --git a/doc/html/functions_vars_p.html b/doc/html/functions_vars_p.html new file mode 100644 index 0000000..03f386e --- /dev/null +++ b/doc/html/functions_vars_p.html @@ -0,0 +1,105 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- p -

+
+
+ + + + + diff --git a/doc/html/functions_vars_q.html b/doc/html/functions_vars_q.html new file mode 100644 index 0000000..ae5b02c --- /dev/null +++ b/doc/html/functions_vars_q.html @@ -0,0 +1,80 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- q -

+
+
+ + + + + diff --git a/doc/html/functions_vars_r.html b/doc/html/functions_vars_r.html new file mode 100644 index 0000000..a9c20fb --- /dev/null +++ b/doc/html/functions_vars_r.html @@ -0,0 +1,121 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- r -

+
+
+ + + + + diff --git a/doc/html/functions_vars_s.html b/doc/html/functions_vars_s.html new file mode 100644 index 0000000..e6a4e85 --- /dev/null +++ b/doc/html/functions_vars_s.html @@ -0,0 +1,113 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- s -

+
+
+ + + + + diff --git a/doc/html/functions_vars_t.html b/doc/html/functions_vars_t.html new file mode 100644 index 0000000..6a1d668 --- /dev/null +++ b/doc/html/functions_vars_t.html @@ -0,0 +1,99 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- t -

+
+
+ + + + + diff --git a/doc/html/functions_vars_v.html b/doc/html/functions_vars_v.html new file mode 100644 index 0000000..6356653 --- /dev/null +++ b/doc/html/functions_vars_v.html @@ -0,0 +1,88 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- v -

+
+
+ + + + + diff --git a/doc/html/functions_vars_w.html b/doc/html/functions_vars_w.html new file mode 100644 index 0000000..4034b01 --- /dev/null +++ b/doc/html/functions_vars_w.html @@ -0,0 +1,83 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ + + + + + + diff --git a/doc/html/functions_vars_x.html b/doc/html/functions_vars_x.html new file mode 100644 index 0000000..17d2cc6 --- /dev/null +++ b/doc/html/functions_vars_x.html @@ -0,0 +1,95 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ + + + + + + diff --git a/doc/html/functions_vars_y.html b/doc/html/functions_vars_y.html new file mode 100644 index 0000000..96f739b --- /dev/null +++ b/doc/html/functions_vars_y.html @@ -0,0 +1,83 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- y -

+
+
+ + + + + diff --git a/doc/html/functions_w.html b/doc/html/functions_w.html new file mode 100644 index 0000000..8c463ab --- /dev/null +++ b/doc/html/functions_w.html @@ -0,0 +1,83 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- w -

+
+
+ + + + + diff --git a/doc/html/functions_x.html b/doc/html/functions_x.html new file mode 100644 index 0000000..e54c6eb --- /dev/null +++ b/doc/html/functions_x.html @@ -0,0 +1,95 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- x -

+
+
+ + + + + diff --git a/doc/html/functions_y.html b/doc/html/functions_y.html new file mode 100644 index 0000000..47cbd2d --- /dev/null +++ b/doc/html/functions_y.html @@ -0,0 +1,83 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- y -

+
+
+ + + + + diff --git a/doc/html/get__sigsize_8c.html b/doc/html/get__sigsize_8c.html new file mode 100644 index 0000000..e1196ac --- /dev/null +++ b/doc/html/get__sigsize_8c.html @@ -0,0 +1,93 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/member/get_sigsize.c File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
get_sigsize.c File Reference
+
+
+ +

EpidGetSigSize implementation. +More...

+ + + + + +

+Functions

size_t EpidGetSigSize (SigRl const *sig_rl)
 Computes the size in bytes required for a Intel(R) EPID signature. More...
 
+

Detailed Description

+

EpidGetSigSize implementation.

+
+
+ + + + + diff --git a/doc/html/globals.html b/doc/html/globals.html new file mode 100644 index 0000000..85cb870 --- /dev/null +++ b/doc/html/globals.html @@ -0,0 +1,80 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- a -

+
+
+ + + + + diff --git a/doc/html/globals_b.html b/doc/html/globals_b.html new file mode 100644 index 0000000..82c9bd3 --- /dev/null +++ b/doc/html/globals_b.html @@ -0,0 +1,119 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- b -

+
+
+ + + + + diff --git a/doc/html/globals_c.html b/doc/html/globals_c.html new file mode 100644 index 0000000..a3ef228 --- /dev/null +++ b/doc/html/globals_c.html @@ -0,0 +1,104 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- c -

+
+
+ + + + + diff --git a/doc/html/globals_d.html b/doc/html/globals_d.html new file mode 100644 index 0000000..48bbd7b --- /dev/null +++ b/doc/html/globals_d.html @@ -0,0 +1,120 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- d -

+
+
+ + + + + diff --git a/doc/html/globals_defs.html b/doc/html/globals_defs.html new file mode 100644 index 0000000..63b1b75 --- /dev/null +++ b/doc/html/globals_defs.html @@ -0,0 +1,197 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- b -

+ + +

- c -

+ + +

- e -

+ + +

- f -

+ + +

- i -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- w -

+
+
+ + + + + diff --git a/doc/html/globals_e.html b/doc/html/globals_e.html new file mode 100644 index 0000000..a2efb89 --- /dev/null +++ b/doc/html/globals_e.html @@ -0,0 +1,308 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- e -

+
+
+ + + + + diff --git a/doc/html/globals_enum.html b/doc/html/globals_enum.html new file mode 100644 index 0000000..9054ce7 --- /dev/null +++ b/doc/html/globals_enum.html @@ -0,0 +1,86 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
+ + + + + diff --git a/doc/html/globals_eval.html b/doc/html/globals_eval.html new file mode 100644 index 0000000..4e265cb --- /dev/null +++ b/doc/html/globals_eval.html @@ -0,0 +1,184 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- k -

+
+
+ + + + + diff --git a/doc/html/globals_f.html b/doc/html/globals_f.html new file mode 100644 index 0000000..7b7f7bf --- /dev/null +++ b/doc/html/globals_f.html @@ -0,0 +1,129 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- f -

+
+
+ + + + + diff --git a/doc/html/globals_func.html b/doc/html/globals_func.html new file mode 100644 index 0000000..786416a --- /dev/null +++ b/doc/html/globals_func.html @@ -0,0 +1,80 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- a -

+
+
+ + + + + diff --git a/doc/html/globals_func_b.html b/doc/html/globals_func_b.html new file mode 100644 index 0000000..452e4ac --- /dev/null +++ b/doc/html/globals_func_b.html @@ -0,0 +1,92 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- b -

+
+
+ + + + + diff --git a/doc/html/globals_func_c.html b/doc/html/globals_func_c.html new file mode 100644 index 0000000..032b6ee --- /dev/null +++ b/doc/html/globals_func_c.html @@ -0,0 +1,99 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- c -

+
+
+ + + + + diff --git a/doc/html/globals_func_d.html b/doc/html/globals_func_d.html new file mode 100644 index 0000000..b6f814e --- /dev/null +++ b/doc/html/globals_func_d.html @@ -0,0 +1,120 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- d -

+
+
+ + + + + diff --git a/doc/html/globals_func_e.html b/doc/html/globals_func_e.html new file mode 100644 index 0000000..e0bd93d --- /dev/null +++ b/doc/html/globals_func_e.html @@ -0,0 +1,287 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- e -

+
+
+ + + + + diff --git a/doc/html/globals_func_f.html b/doc/html/globals_func_f.html new file mode 100644 index 0000000..b3b0673 --- /dev/null +++ b/doc/html/globals_func_f.html @@ -0,0 +1,120 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- f -

+
+
+ + + + + diff --git a/doc/html/globals_func_i.html b/doc/html/globals_func_i.html new file mode 100644 index 0000000..26cdb45 --- /dev/null +++ b/doc/html/globals_func_i.html @@ -0,0 +1,83 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- i -

+
+
+ + + + + diff --git a/doc/html/globals_func_m.html b/doc/html/globals_func_m.html new file mode 100644 index 0000000..58fbba2 --- /dev/null +++ b/doc/html/globals_func_m.html @@ -0,0 +1,80 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- m -

+
+
+ + + + + diff --git a/doc/html/globals_func_n.html b/doc/html/globals_func_n.html new file mode 100644 index 0000000..e940ff2 --- /dev/null +++ b/doc/html/globals_func_n.html @@ -0,0 +1,107 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- n -

+
+
+ + + + + diff --git a/doc/html/globals_func_o.html b/doc/html/globals_func_o.html new file mode 100644 index 0000000..ec740c2 --- /dev/null +++ b/doc/html/globals_func_o.html @@ -0,0 +1,79 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- o -

+
+
+ + + + + diff --git a/doc/html/globals_func_p.html b/doc/html/globals_func_p.html new file mode 100644 index 0000000..61f42fd --- /dev/null +++ b/doc/html/globals_func_p.html @@ -0,0 +1,128 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- p -

+
+
+ + + + + diff --git a/doc/html/globals_func_r.html b/doc/html/globals_func_r.html new file mode 100644 index 0000000..f4db740 --- /dev/null +++ b/doc/html/globals_func_r.html @@ -0,0 +1,88 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- r -

+
+
+ + + + + diff --git a/doc/html/globals_func_s.html b/doc/html/globals_func_s.html new file mode 100644 index 0000000..8dad2c4 --- /dev/null +++ b/doc/html/globals_func_s.html @@ -0,0 +1,99 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- s -

+
+
+ + + + + diff --git a/doc/html/globals_func_w.html b/doc/html/globals_func_w.html new file mode 100644 index 0000000..378005e --- /dev/null +++ b/doc/html/globals_func_w.html @@ -0,0 +1,88 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+  + +

- w -

+
+
+ + + + + diff --git a/doc/html/globals_g.html b/doc/html/globals_g.html new file mode 100644 index 0000000..363836c --- /dev/null +++ b/doc/html/globals_g.html @@ -0,0 +1,79 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- g -

+
+
+ + + + + diff --git a/doc/html/globals_h.html b/doc/html/globals_h.html new file mode 100644 index 0000000..e45607a --- /dev/null +++ b/doc/html/globals_h.html @@ -0,0 +1,79 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- h -

+
+
+ + + + + diff --git a/doc/html/globals_i.html b/doc/html/globals_i.html new file mode 100644 index 0000000..6d046c6 --- /dev/null +++ b/doc/html/globals_i.html @@ -0,0 +1,89 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- i -

+
+
+ + + + + diff --git a/doc/html/globals_k.html b/doc/html/globals_k.html new file mode 100644 index 0000000..0952438 --- /dev/null +++ b/doc/html/globals_k.html @@ -0,0 +1,188 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- k -

+
+
+ + + + + diff --git a/doc/html/globals_m.html b/doc/html/globals_m.html new file mode 100644 index 0000000..b688464 --- /dev/null +++ b/doc/html/globals_m.html @@ -0,0 +1,86 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- m -

+
+
+ + + + + diff --git a/doc/html/globals_n.html b/doc/html/globals_n.html new file mode 100644 index 0000000..1b72d41 --- /dev/null +++ b/doc/html/globals_n.html @@ -0,0 +1,110 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- n -

+
+
+ + + + + diff --git a/doc/html/globals_o.html b/doc/html/globals_o.html new file mode 100644 index 0000000..8b0da4a --- /dev/null +++ b/doc/html/globals_o.html @@ -0,0 +1,79 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- o -

+
+
+ + + + + diff --git a/doc/html/globals_p.html b/doc/html/globals_p.html new file mode 100644 index 0000000..196ac75 --- /dev/null +++ b/doc/html/globals_p.html @@ -0,0 +1,137 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- p -

+
+
+ + + + + diff --git a/doc/html/globals_r.html b/doc/html/globals_r.html new file mode 100644 index 0000000..a3f9836 --- /dev/null +++ b/doc/html/globals_r.html @@ -0,0 +1,100 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- r -

+
+
+ + + + + diff --git a/doc/html/globals_s.html b/doc/html/globals_s.html new file mode 100644 index 0000000..91f6e87 --- /dev/null +++ b/doc/html/globals_s.html @@ -0,0 +1,114 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- s -

+
+
+ + + + + diff --git a/doc/html/globals_t.html b/doc/html/globals_t.html new file mode 100644 index 0000000..a6e1ee1 --- /dev/null +++ b/doc/html/globals_t.html @@ -0,0 +1,79 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- t -

+
+
+ + + + + diff --git a/doc/html/globals_type.html b/doc/html/globals_type.html new file mode 100644 index 0000000..8975797 --- /dev/null +++ b/doc/html/globals_type.html @@ -0,0 +1,110 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
+ + + + + diff --git a/doc/html/globals_vars.html b/doc/html/globals_vars.html new file mode 100644 index 0000000..80dfdad --- /dev/null +++ b/doc/html/globals_vars.html @@ -0,0 +1,78 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
+ + + + + diff --git a/doc/html/globals_w.html b/doc/html/globals_w.html new file mode 100644 index 0000000..6a29179 --- /dev/null +++ b/doc/html/globals_w.html @@ -0,0 +1,91 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- w -

+
+
+ + + + + diff --git a/doc/html/glossary_8dox.html b/doc/html/glossary_8dox.html new file mode 100644 index 0000000..268f395 --- /dev/null +++ b/doc/html/glossary_8dox.html @@ -0,0 +1,82 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: doc/docsrc/glossary.dox File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
doc/docsrc/glossary.dox File Reference
+
+
+ +

This file is used by Doxygen to generate documentation. +More...

+

Detailed Description

+

This file is used by Doxygen to generate documentation.

+
+
+ + + + + diff --git a/doc/html/group___big_num_primitives.html b/doc/html/group___big_num_primitives.html new file mode 100644 index 0000000..c54ac40 --- /dev/null +++ b/doc/html/group___big_num_primitives.html @@ -0,0 +1,445 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: bignum + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
bignum
+
+
+ +

Big number operations. +More...

+ + + + + +

+Typedefs

+typedef struct BigNum BigNum
 Internal representation of large numbers.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

EpidStatus NewBigNum (size_t data_size_bytes, BigNum **bignum)
 Constructs a new BigNum. More...
 
void DeleteBigNum (BigNum **bignum)
 Deletes a previously allocated BigNum. More...
 
EpidStatus ReadBigNum (void const *bn_str, size_t strlen, BigNum *bn)
 Deserializes a BigNum from a string. More...
 
EpidStatus WriteBigNum (BigNum const *bn, size_t strlen, void const *bn_str)
 Serializes a BigNum to a string. More...
 
EpidStatus BigNumAdd (BigNum const *a, BigNum const *b, BigNum *r)
 Adds two BigNum values. More...
 
EpidStatus BigNumSub (BigNum const *a, BigNum const *b, BigNum *r)
 Subtracts two BigNum values. More...
 
EpidStatus BigNumMul (BigNum const *a, BigNum const *b, BigNum *r)
 Multiplies two BigNum values. More...
 
EpidStatus BigNumMod (BigNum const *a, BigNum const *b, BigNum *r)
 Computes modular reduction for BigNum value by specified modulus. More...
 
+

Detailed Description

+

Big number operations.

+

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.

+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus BigNumAdd (BigNum const * a,
BigNum const * b,
BigNumr 
)
+
+ +

Adds two BigNum values.

+
Parameters
+ + + + +
[in]aThe left hand parameter.
[in]bThe right hand parameter.
[out]rThe result of adding a and b.
+
+
+
Returns
EpidStatus
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus BigNumMod (BigNum const * a,
BigNum const * b,
BigNumr 
)
+
+ +

Computes modular reduction for BigNum value by specified modulus.

+
Parameters
+ + + + +
[in]aThe BigNum value.
[in]bThe modulus.
[out]rModular reduction result.
+
+
+
Returns
EpidStatus
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus BigNumMul (BigNum const * a,
BigNum const * b,
BigNumr 
)
+
+ +

Multiplies two BigNum values.

+
Parameters
+ + + + +
[in]aThe left hand parameter.
[in]bThe right hand parameter.
[out]rThe result of multiplying a and b.
+
+
+
Returns
EpidStatus
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus BigNumSub (BigNum const * a,
BigNum const * b,
BigNumr 
)
+
+ +

Subtracts two BigNum values.

+
Parameters
+ + + + +
[in]aThe left hand parameter.
[in]bThe right hand parameter.
[out]rThe result of subtracting a and b.
+
+
+
Returns
EpidStatus
+ +
+
+ +
+
+ + + + + + + + +
void DeleteBigNum (BigNum ** bignum)
+
+ +

Deletes a previously allocated BigNum.

+

Frees memory pointed to by bignum. Nulls the pointer.

+
Parameters
+ + +
[in]bignumThe BigNum. Can be NULL.
+
+
+
See also
NewBigNum
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
EpidStatus NewBigNum (size_t data_size_bytes,
BigNum ** bignum 
)
+
+ +

Constructs a new BigNum.

+

Allocates memory and creates a new BigNum.

+

Use DeleteBigNum() to free memory.

+
Parameters
+ + + +
[in]data_size_bytesThe size in bytes of the new number.
[out]bignumThe BigNum.
+
+
+
Returns
EpidStatus
+
See also
DeleteBigNum
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus ReadBigNum (void const * bn_str,
size_t strlen,
BigNumbn 
)
+
+ +

Deserializes a BigNum from a string.

+
Parameters
+ + + + +
[in]bn_strThe serialized value.
[in]strlenThe size of bn_str in bytes.
[out]bnThe target BigNum.
+
+
+
Returns
EpidStatus
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus WriteBigNum (BigNum const * bn,
size_t strlen,
void const * bn_str 
)
+
+ +

Serializes a BigNum to a string.

+
Parameters
+ + + + +
[in]bnThe BigNum to be serialized.
[in]strlenThe size of bn_str in bytes.
[out]bn_strThe target string.
+
+
+
Returns
EpidStatus
+ +
+
+
+
+ + + + + diff --git a/doc/html/group___big_num_primitives.js b/doc/html/group___big_num_primitives.js new file mode 100644 index 0000000..d4354d5 --- /dev/null +++ b/doc/html/group___big_num_primitives.js @@ -0,0 +1,12 @@ +var group___big_num_primitives = +[ + [ "BigNum", "group___big_num_primitives.html#ga2bf153e27be2683f0fb26f0f7ff1f718", null ], + [ "BigNumAdd", "group___big_num_primitives.html#gae70fd9b3026f0ab3c7e9601d0a3186b8", null ], + [ "BigNumMod", "group___big_num_primitives.html#ga7dd6038987210d10bf843602fef0c929", null ], + [ "BigNumMul", "group___big_num_primitives.html#ga03c89b8b8dd87de2c0f4b5822145d317", 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#ga808cf477b70ed06358b11756bfe36024", null ], + [ "WriteBigNum", "group___big_num_primitives.html#ga47f356d816bcb5742ba6d78000861328", 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..de489f9 --- /dev/null +++ b/doc/html/group___ec_group_primitives.html @@ -0,0 +1,1078 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: ecgroup + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
ecgroup
+
+
+ +

Elliptic curve group operations. +More...

+ + + + + + + + +

+Typedefs

+typedef struct EcGroup EcGroup
 Elliptic curve group over finite field.
 
+typedef struct EcPoint EcPoint
 Point on elliptic curve over finite field.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

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)
 Constructs a new EcGroup. More...
 
void DeleteEcGroup (EcGroup **g)
 Deletes a previously allocated EcGroup. More...
 
EpidStatus NewEcPoint (EcGroup const *g, EcPoint **p)
 Creates a new EcPoint. More...
 
void DeleteEcPoint (EcPoint **p)
 Deletes a previously allocated EcPoint. More...
 
EpidStatus ReadEcPoint (EcGroup *g, void const *p_str, size_t strlen, EcPoint *p)
 Deserializes an EcPoint from a string. More...
 
EpidStatus WriteEcPoint (EcGroup *g, EcPoint const *p, void *p_str, size_t strlen)
 Serializes an EcPoint to a string. More...
 
EpidStatus EcMul (EcGroup *g, EcPoint const *a, EcPoint const *b, EcPoint *r)
 Multiplies two elements in an elliptic curve group. More...
 
EpidStatus EcExp (EcGroup *g, EcPoint const *a, BigNumStr const *b, EcPoint *r)
 Raises a point in an elliptic curve group to a power. More...
 
EpidStatus EcSscmExp (EcGroup *g, EcPoint const *a, BigNumStr const *b, EcPoint *r)
 Software side-channel mitigated implementation of EcExp. More...
 
EpidStatus EcMultiExp (EcGroup *g, EcPoint const **a, BigNumStr const **b, size_t m, EcPoint *r)
 Multi-exponentiates elements in elliptic curve group. More...
 
EpidStatus EcSscmMultiExp (EcGroup *g, EcPoint const **a, BigNumStr const **b, size_t m, EcPoint *r)
 Software side-channel mitigated implementation of EcMultiExp. More...
 
EpidStatus EcGetRandom (EcGroup *g, BitSupplier rnd_func, void *rnd_func_param, EcPoint *r)
 Generates a random element from an elliptic curve group. More...
 
EpidStatus EcInGroup (EcGroup *g, void const *p_str, size_t strlen, bool *in_group)
 Checks if a point is in an elliptic curve group. More...
 
EpidStatus EcHash (EcGroup *g, void const *msg, size_t msg_len, HashAlg hash_alg, EcPoint *r)
 Hashes an arbitrary message to an element in an elliptic curve group. More...
 
EpidStatus EcMakePoint (EcGroup *g, FfElement const *x, EcPoint *r)
 Sets an EcPoint variable to a point on a curve. More...
 
EpidStatus EcInverse (EcGroup *g, EcPoint const *p, EcPoint *r)
 Computes the additive inverse of an EcPoint. More...
 
EpidStatus EcIsEqual (EcGroup *g, EcPoint const *a, EcPoint const *b, bool *is_equal)
 Checks if two EcPoints are equal. More...
 
EpidStatus EcIsIdentity (EcGroup *g, EcPoint const *p, bool *is_identity)
 Checks if an EcPoint is the identity element. More...
 
+

Detailed Description

+

Elliptic curve group operations.

+

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).

+

Function Documentation

+ +
+
+ + + + + + + + +
void DeleteEcGroup (EcGroup ** g)
+
+ +

Deletes a previously allocated EcGroup.

+

Frees memory pointed to by elliptic curve group. Nulls the pointer.

+
Parameters
+ + +
[in]gThe elliptic curve group. Can be NULL.
+
+
+
See also
NewEcGroup
+ +
+
+ +
+
+ + + + + + + + +
void DeleteEcPoint (EcPoint ** p)
+
+ +

Deletes a previously allocated EcPoint.

+

Frees memory used by a point on elliptic curve group. Nulls the pointer.

+
Parameters
+ + +
[in]pThe EcPoint. Can be NULL.
+
+
+
See also
NewEcPoint
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EcExp (EcGroupg,
EcPoint const * a,
BigNumStr const * b,
EcPointr 
)
+
+ +

Raises a point in an elliptic curve group to a power.

+

This exponentiation operation is also known as element multiplication for elliptic curve groups.

Parameters
+ + + + + +
[in]gThe elliptic curve group.
[in]aThe base.
[in]bThe power. Power must be less than the order of the elliptic curve group.
[out]rThe result of raising a to the power b.
+
+
+
Returns
EpidStatus
+
See also
NewEcGroup
+
+NewEcPoint
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EcGetRandom (EcGroupg,
BitSupplier rnd_func,
void * rnd_func_param,
EcPointr 
)
+
+ +

Generates a random element from an elliptic curve group.

+

This function is only available for G1 and GT.

+
Parameters
+ + + + + +
[in]gThe elliptic curve group.
[in]rnd_funcRandom number generator.
[in]rnd_func_paramPass through context data for rnd_func.
[in,out]rOutput random elliptic curve element.
+
+
+
Returns
EpidStatus
+
See also
NewEcPoint
+
+BitSupplier
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EcHash (EcGroupg,
void const * msg,
size_t msg_len,
HashAlg hash_alg,
EcPointr 
)
+
+ +

Hashes an arbitrary message to an element in an elliptic curve group.

+
Parameters
+ + + + + + +
[in]gThe elliptic curve group.
[in]msgThe message.
[in]msg_lenThe size of msg in bytes.
[in]hash_algThe hash algorithm.
[out]rThe hashed value.
+
+
+
Returns
EpidStatus
+
See also
NewEcGroup
+
+NewEcPoint
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EcInGroup (EcGroupg,
void const * p_str,
size_t strlen,
boolin_group 
)
+
+ +

Checks if a point is in an elliptic curve group.

+
Parameters
+ + + + + +
[in]gThe elliptic curve group.
[in]p_strA serialized point. Must be a G1ElemStr or G2ElemStr.
[in]strlenThe size of p_str in bytes.
[out]in_groupThe result of the check.
+
+
+
Returns
EpidStatus
+
See also
NewEcPoint
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EcInverse (EcGroupg,
EcPoint const * p,
EcPointr 
)
+
+ +

Computes the additive inverse of an EcPoint.

+

This inverse operation is also known as element negation for elliptic curve groups.

+
Parameters
+ + + + +
[in]gThe elliptic curve group.
[in]pThe point.
[out]rThe inverted point.
+
+
+
Returns
EpidStatus
+
See also
NewEcGroup
+
+NewEcPoint
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EcIsEqual (EcGroupg,
EcPoint const * a,
EcPoint const * b,
boolis_equal 
)
+
+ +

Checks if two EcPoints are equal.

+
Parameters
+ + + + + +
[in]gThe elliptic curve group.
[in]aA point to check.
[in]bAnother point to check.
[out]is_equalThe result of the check.
+
+
+
Returns
EpidStatus
+
See also
NewEcGroup
+
+NewEcPoint
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EcIsIdentity (EcGroupg,
EcPoint const * p,
boolis_identity 
)
+
+ +

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.

+
Parameters
+ + + + +
[in]gThe elliptic curve group.
[in]pThe point to check.
[out]is_identityThe result of the check.
+
+
+
Returns
EpidStatus
+
See also
NewEcGroup
+
+NewEcPoint
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EcMakePoint (EcGroupg,
FfElement const * x,
EcPointr 
)
+
+ +

Sets an EcPoint variable to a point on a curve.

+

This function is only available for G1.

+
Parameters
+ + + + +
[in]gThe elliptic curve group.
[in]xThe x coordinate.
[out]rThe point.
+
+
+
Returns
EpidStatus
+
See also
NewEcGroup
+
+NewEcPoint
+
+NewFfElement
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EcMul (EcGroupg,
EcPoint const * a,
EcPoint const * b,
EcPointr 
)
+
+ +

Multiplies two elements in an elliptic curve group.

+

This multiplication operation is also known as element addition for elliptic curve groups.

+
Parameters
+ + + + + +
[in]gThe elliptic curve group.
[in]aThe left hand parameter.
[in]bThe right hand parameter.
[out]rThe result of multiplying a and b.
+
+
+
Returns
EpidStatus
+
See also
NewEcGroup
+
+NewEcPoint
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EcMultiExp (EcGroupg,
EcPoint const ** a,
BigNumStr const ** b,
size_t m,
EcPointr 
)
+
+ +

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]).

+
Parameters
+ + + + + + +
[in]gThe elliptic curve group.
[in]aThe bases.
[in]bThe powers. Power must be less than the order of the elliptic curve group.
[in]mNumber of entries in a and b.
[out]rThe result of raising each a to the corresponding power b and multiplying the results.
+
+
+
Returns
EpidStatus
+
See also
NewEcGroup
+
+NewEcPoint
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EcSscmExp (EcGroupg,
EcPoint const * a,
BigNumStr const * b,
EcPointr 
)
+
+ +

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.
+
Parameters
+ + + + + +
[in]gThe elliptic curve group.
[in]aThe base.
[in]bThe power. Power must be less than the order of the elliptic curve group.
[out]rThe result of raising a to the power b.
+
+
+
Returns
EpidStatus
+
See also
NewEcGroup
+
+NewEcPoint
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EcSscmMultiExp (EcGroupg,
EcPoint const ** a,
BigNumStr const ** b,
size_t m,
EcPointr 
)
+
+ +

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.
+
Parameters
+ + + + + + +
[in]gThe elliptic curve group.
[in]aThe bases.
[in]bThe powers. Power must be less than the order of the elliptic curve group.
[in]mNumber of entries in a and b.
[out]rThe result of raising each a to the corresponding power b and multiplying the results.
+
+
+
Returns
EpidStatus
+
See also
NewEcGroup
+
+NewEcPoint
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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 
)
+
+ +

Constructs a new EcGroup.

+

Allocates memory and creates a new elliptic curve group.

+

Use DeleteFiniteField() to free memory.

+
Parameters
+ + + + + + + + + +
[in]ffThe finite field on which the curve is based.
[in]aThe A value of the elliptic curve.
[in]bThe B value of the elliptic curve.
[in]xThe X co-ordinate of the base point of the elliptic curve.
[in]yThe Y co-ordinate of the base point of the elliptic curve.
[in]orderThe order of the elliptic curve group.
[in]cofactorThe co-factor of the elliptic curve.
[out]gThe newly constructed elliptic curve group.
+
+
+
Returns
EpidStatus
+
See also
DeleteEcGroup
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
EpidStatus NewEcPoint (EcGroup const * g,
EcPoint ** p 
)
+
+ +

Creates a new EcPoint.

+

Allocates memory and creates a new point on elliptic curve group.

+

Use DeleteEcPoint() to free memory.

+
Parameters
+ + + +
[in]gElliptic curve group.
[out]pNewly constructed point on the elliptic curve group g.
+
+
+
Returns
EpidStatus
+
See also
NewEcGroup
+
+DeleteEcPoint
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus ReadEcPoint (EcGroupg,
void const * p_str,
size_t strlen,
EcPointp 
)
+
+ +

Deserializes an EcPoint from a string.

+
Parameters
+ + + + + +
[in]gThe elliptic curve group.
[in]p_strThe serialized value.
[in]strlenThe size of p_str in bytes.
[out]pThe target EcPoint.
+
+
+
Returns
EpidStatus
+
See also
NewEcPoint
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus WriteEcPoint (EcGroupg,
EcPoint const * p,
void * p_str,
size_t strlen 
)
+
+ +

Serializes an EcPoint to a string.

+
Parameters
+ + + + + +
[in]gThe elliptic curve group.
[in]pThe EcPoint to be serialized.
[out]p_strThe target string.
[in]strlenthe size of p_str in bytes.
+
+
+
Returns
EpidStatus
+
See also
NewEcPoint
+ +
+
+
+
+ + + + + diff --git a/doc/html/group___ec_group_primitives.js b/doc/html/group___ec_group_primitives.js new file mode 100644 index 0000000..bf32859 --- /dev/null +++ b/doc/html/group___ec_group_primitives.js @@ -0,0 +1,23 @@ +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#gadc22ee07864a7ee681a881029b69d76a", null ], + [ "EcInGroup", "group___ec_group_primitives.html#ga4d0f32aede3066eae500241b387bd970", 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 ], + [ "EcSscmExp", "group___ec_group_primitives.html#gaf3b6a548aa6f0d4f028a14feca251f57", null ], + [ "EcSscmMultiExp", "group___ec_group_primitives.html#ga40e3431d3dbe8cf7a65ada7b7811cba4", null ], + [ "NewEcGroup", "group___ec_group_primitives.html#gaf4e23677dd378ef2e0cf55df79cbdb62", null ], + [ "NewEcPoint", "group___ec_group_primitives.html#ga6417b0ce72ba96de00c329e322fec7fb", null ], + [ "ReadEcPoint", "group___ec_group_primitives.html#ga2d433f567fa2419465a49604f4da21ad", null ], + [ "WriteEcPoint", "group___ec_group_primitives.html#ga4bb7d6691ffbb6e947c1068453e27fbd", 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..e1c37b9 --- /dev/null +++ b/doc/html/group___ecdsa_primitives.html @@ -0,0 +1,229 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: ecdsa + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
ecdsa
+
+
+ +

Elliptic Curve Digital Signature Algorithm Primitives. +More...

+ + + + + + + + +

+Functions

EpidStatus EcdsaVerifyBuffer (void const *buf, size_t buf_len, EcdsaPublicKey const *pubkey, EcdsaSignature const *sig)
 Verifies authenticity of a digital signature over a buffer. More...
 
EpidStatus EcdsaSignBuffer (void const *buf, size_t buf_len, EcdsaPrivateKey const *privkey, BitSupplier rnd_func, void *rnd_param, EcdsaSignature *sig)
 Creates ECDSA signature of buffer. More...
 
+

Detailed Description

+

Elliptic Curve Digital Signature Algorithm Primitives.

+

Provides APIs for computing and checking buffer signatures using the Elliptic Curve Digital Signature Algorithm.

+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EcdsaSignBuffer (void const * buf,
size_t buf_len,
EcdsaPrivateKey const * privkey,
BitSupplier rnd_func,
void * rnd_param,
EcdsaSignaturesig 
)
+
+ +

Creates ECDSA signature of buffer.

+

Uses Elliptic Curve Digital Signature Algorithm (ECDSA) to generate a signature of the SHA256 hash of the input buffer with the provided private key.

+

The operation is over the standard secp256r1 curve.

+
Parameters
+ + + + + + + +
[in]bufPointer to buffer containing message to sign.
[in]buf_lenThe size of buf in bytes.
[in]privkeyThe ECDSA private key on secp256r1 curve.
[in]rnd_funcRandom number generator.
[in]rnd_paramPass through context data for rnd_func.
[out]sigThe resulting ECDSA signature.
+
+
+
Returns
EpidStatus
+
Return values
+ + +
kEpidRandMaxIterErrFailed to sign after maximum number of iterations due to bad luck in random number generation.
+
+
+
See also
EcdsaSignBuffer
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EcdsaVerifyBuffer (void const * buf,
size_t buf_len,
EcdsaPublicKey const * pubkey,
EcdsaSignature const * sig 
)
+
+ +

Verifies authenticity of a digital signature over a buffer.

+

Uses Elliptic Curve Digital Signature Algorithm (ECDSA) to verify that the SHA256 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.
+
Parameters
+ + + + + +
[in]bufPointer to buffer containing message to verify.
[in]buf_lenThe size of buf in bytes.
[in]pubkeyThe ECDSA public key on secp256r1 curve.
[in]sigThe ECDSA signature to be verified.
+
+
+
Returns
EpidStatus
+
Return values
+ + + +
kEpidSigValidEcdsaSignature is valid for the given buffer.
kEpidSigInvalidEcdsaSignature is invalid for the given buffer.
+
+
+
See also
EcdsaSignBuffer
+ +
+
+
+
+ + + + + diff --git a/doc/html/group___ecdsa_primitives.js b/doc/html/group___ecdsa_primitives.js new file mode 100644 index 0000000..37f85bf --- /dev/null +++ b/doc/html/group___ecdsa_primitives.js @@ -0,0 +1,5 @@ +var group___ecdsa_primitives = +[ + [ "EcdsaSignBuffer", "group___ecdsa_primitives.html#ga67091ecae643c1b8a0b0a4946eda7afe", null ], + [ "EcdsaVerifyBuffer", "group___ecdsa_primitives.html#gaab68de7291db6e42a01e99c2fa40057f", 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..e094004 --- /dev/null +++ b/doc/html/group___epid_common.html @@ -0,0 +1,1066 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: common + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+ +
+ +

Common code shared between core sub-components. +More...

+ + + + + + + + + + + + + + + + + +

+Modules

 math
 Math Primitives and Group Operations.
 
 errors
 Error reporting interface.
 
 fileparser
 Parser for issuer material.
 
 print_utils
 Debug print routines.
 
 types
 SDK data types.
 
+ + + + + + + + + + + + + +

+Data Structures

struct  CommitValues
 Storage for values to create commitment in Sign and Verify algorithms. More...
 
struct  Epid2Params_
 Internal representation of Epid2Params. More...
 
struct  GroupPubKey_
 Internal representation of GroupPubKey. More...
 
struct  PrivKey_
 Internal implementation of PrivKey. More...
 
+ + + + + + + + + + + + + + + + +

+Macros

#define ntohl(u32)
 Macros to transform oct str 32 into uint_32. More...
 
+#define EPID_ENABLE_EPID_ZERO_MEMORY_ON_FREE
 When enabled secrets are wiped out from the memory by EpidFree.
 
+#define SAFE_ALLOC(size)   EpidAlloc(size);
 Allocates zero initalized block of memory.
 
#define SAFE_FREE(ptr)
 Deallocates space allocated by SAFE_ALLOC() and nulls pointer. More...
 
+#define SAFE_REALLOC(ptr, size)   EpidRealloc((ptr), (size))
 Changes the size of the memory block pointed to by ptr.
 
+ + + + +

+Typedefs

typedef int(__STDCALL * BitSupplier) (unsigned int *rand_data, int num_bits, void *user_data)
 Generates random data. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

EpidStatus SetKeySpecificCommitValues (GroupPubKey const *pub_key, CommitValues *values)
 Set group public key related fields from CommitValues structure. More...
 
EpidStatus SetCalculatedCommitValues (G1ElemStr const *B, G1ElemStr const *K, G1ElemStr const *T, EcPoint const *R1, EcGroup *G1, FfElement const *R2, FiniteField *GT, CommitValues *values)
 Set CommitValues structure fields calculated in algorithm. More...
 
EpidStatus CalculateCommitmentHash (CommitValues const *values, FiniteField *Fp, HashAlg hash_alg, void const *msg, size_t msg_len, FfElement *c)
 Calculate Fp.hash(t3 || m) for Sign and Verfiy algorithms. More...
 
EpidStatus CreateEpid2Params (Epid2Params_ **params)
 Constructs the internal representation of Epid2Params. More...
 
void DeleteEpid2Params (Epid2Params_ **epid_params)
 Deallocates storage for internal representation of Epid2Params. More...
 
EpidStatus CreateGroupPubKey (GroupPubKey const *pub_key_str, EcGroup *G1, EcGroup *G2, GroupPubKey_ **pub_key)
 Constructs internal representation of GroupPubKey. More...
 
void DeleteGroupPubKey (GroupPubKey_ **pub_key)
 Deallocates storage for internal representation of GroupPubKey. More...
 
void EpidZeroMemory (void *ptr, size_t size)
 Clear information stored in block of memory pointer to by ptr. More...
 
void * EpidAlloc (size_t size)
 Allocates memory of size bytes. More...
 
void * EpidRealloc (void *ptr, size_t new_size)
 Reallocates memory allocated by EpidAlloc. More...
 
void EpidFree (void *ptr)
 Frees memory allocated by EpidAlloc. More...
 
int memcpy_S (void *dest, size_t destsz, void const *src, size_t count)
 Copies bytes between buffers with security ehancements. More...
 
bool IsSigRlValid (GroupId const *gid, SigRl const *sig_rl, size_t sig_rl_size)
 Function to verify if signature based revocation list is valid. More...
 
bool CreateStack (size_t element_size, Stack **stack)
 Create stack. More...
 
void * StackPushN (Stack *stack, size_t n, void *elements)
 Push multiple elements to the stack. More...
 
bool StackPopN (Stack *stack, size_t n, void *elements)
 Pop multiple elements from the stack. More...
 
size_t StackGetSize (Stack const *stack)
 Get number of elements in the stack. More...
 
void DeleteStack (Stack **stack)
 Deallocates memory used for the stack. More...
 
EpidStatus CreatePrivKey (PrivKey const *priv_key_str, EcGroup *G1, FiniteField *Fp, PrivKey_ **priv_key)
 Constructs internal representation of PrivKey. More...
 
void DeletePrivKey (PrivKey_ **priv_key)
 Deallocate storage for internal representation of PrivKey. More...
 
+

Detailed Description

+

Common code shared between core sub-components.

+

Constants, utility functions, and libraries that are used widely in the implementation or definition of APIs and samples.

+

Macro Definition Documentation

+ +
+
+ + + + + + + + +
#define ntohl( u32)
+
+Value:
((uint32_t)(((((unsigned char*)&(u32))[0]) << 24) + \
((((unsigned char*)&(u32))[1]) << 16) + \
((((unsigned char*)&(u32))[2]) << 8) + \
(((unsigned char*)&(u32))[3])))
+

Macros to transform oct str 32 into uint_32.

+ +
+
+ +
+
+ + + + + + + + +
#define SAFE_FREE( ptr)
+
+Value:
{ \
if (NULL != (ptr)) { \
EpidFree(ptr); \
(ptr) = NULL; \
} \
}
+

Deallocates space allocated by SAFE_ALLOC() and nulls pointer.

+ +
+
+

Typedef Documentation

+ +
+
+ + + + +
typedef int(__STDCALL* BitSupplier) (unsigned int *rand_data, int num_bits, void *user_data)
+
+ +

Generates random data.

+

It is the responsibility of the caller of the SDK interfaces to implement a function of this prototype and to then pass a pointer to this function into methods that require it.

+
Parameters
+ + + + +
[out]rand_datadestination buffer
[in]num_bitssize of rand_data in bits
[in]user_datauser data passed through from api call.
+
+
+
Returns
zero on success and non-zero value on error.
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus CalculateCommitmentHash (CommitValues const * values,
FiniteFieldFp,
HashAlg hash_alg,
void const * msg,
size_t msg_len,
FfElementc 
)
+
+ +

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).

+
Parameters
+ + + + + + + +
[in]valuesCommit values to hash
[in]FpFinite field to perfom hash operation in
[in]hash_algHash algorithm to use
[in]msgMessage to hash
[in]msg_lenSize of msg buffer in bytes
[out]cResult of calculation
+
+
+
Returns
EpidStatus
+
See also
SetKeySpecificCommitValues
+
+SetCalculatedCommitValues
+ +
+
+ +
+
+ + + + + + + + +
EpidStatus CreateEpid2Params (Epid2Params_ ** params)
+
+ +

Constructs the internal representation of Epid2Params.

+

Allocates memory for the internal representation of Epid2Params. Initialize the Epid2Params. Use DeleteEpid2Params() to deallocate memory.

+
Parameters
+ + +
[in,out]paramsInternal Epid2Params
+
+
+
Returns
EpidStatus
+
See also
DeleteEpid2Params
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus CreateGroupPubKey (GroupPubKey const * pub_key_str,
EcGroupG1,
EcGroupG2,
GroupPubKey_ ** pub_key 
)
+
+ +

Constructs internal representation of GroupPubKey.

+

Allocates memory and initializes gid, h1, h2, w parameters. Use DeleteGroupPubKey() to deallocate memory

+
Parameters
+ + + + + +
[in]pub_key_strOct string representation of group public key
[in]G1EcGroup containing elements h1 and h2
[in]G2EcGroup containing element w
[out]pub_keyGroup public key: (gid, h1, h2, w)
+
+
+
Returns
EpidStatus
+
See also
DeleteGroupPubKey
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus CreatePrivKey (PrivKey const * priv_key_str,
EcGroupG1,
FiniteFieldFp,
PrivKey_ ** priv_key 
)
+
+ +

Constructs internal representation of PrivKey.

+

This function allocates memory and initializes gid, A, x, f parameters.

+
Parameters
+ + + + + +
[in]priv_key_strSerialized representation of private key
[in]G1EcGroup containing element A
[in]FpFiniteField containing elements x and f
[out]priv_keyNewly created private key: (gid, A, x, f)
+
+
+
Returns
EpidStatus
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool CreateStack (size_t element_size,
Stack ** stack 
)
+
+ +

Create stack.

+
Parameters
+ + + +
[in]element_sizeSize of stack element
[out]stackStack context to be created
+
+
+
Returns
true is operation succeed, false if stack were failed to allocate
+
See also
DeleteStack
+ +
+
+ +
+
+ + + + + + + + +
void DeleteEpid2Params (Epid2Params_ ** epid_params)
+
+ +

Deallocates storage for internal representation of Epid2Params.

+

Frees the memory and nulls the pointer.

+
Parameters
+ + +
[in,out]epid_paramsparams to be deallocated
+
+
+
See also
CreateEpid2Params
+ +
+
+ +
+
+ + + + + + + + +
void DeleteGroupPubKey (GroupPubKey_ ** pub_key)
+
+ +

Deallocates storage for internal representation of GroupPubKey.

+

Frees memory pointed to by Group public key. Nulls the pointer.

+
Parameters
+ + +
[in]pub_keyGroup public key to be freed
+
+
+
See also
CreateGroupPubKey
+ +
+
+ +
+
+ + + + + + + + +
void DeletePrivKey (PrivKey_ ** priv_key)
+
+ +

Deallocate storage for internal representation of PrivKey.

+

Frees memory pointed to by Member private key. Nulls the pointer.

+
Parameters
+ + +
[in]priv_keyMember private key to be freed
+
+
+ +
+
+ +
+
+ + + + + + + + +
void DeleteStack (Stack ** stack)
+
+ +

Deallocates memory used for the stack.

+
Parameters
+ + +
[in,out]stackStack context
+
+
+
See also
CreateStack
+ +
+
+ +
+
+ + + + + + + + +
void* EpidAlloc (size_t size)
+
+ +

Allocates memory of size bytes.

+

The content of memory is initialized with zeros. Memory must be freed with EpidFree function.

+
Parameters
+ + +
[in]sizenumber of bytes to allocate
+
+
+
Returns
pointer to allocated memory.
+ +
+
+ +
+
+ + + + + + + + +
void EpidFree (void * ptr)
+
+ +

Frees memory allocated by EpidAlloc.

+

Clears information stored in the block of memory.

+
Parameters
+ + +
[in]ptrpointer to allocated memory block
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void* EpidRealloc (void * ptr,
size_t new_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.

+
Parameters
+ + + +
[in]ptrpointer to memory block to reallocate
[in]new_sizenumber of bytes to reallocate for
+
+
+
Returns
pointer to allocated memory.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void EpidZeroMemory (void * ptr,
size_t size 
)
+
+ +

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).
+
Parameters
+ + + +
[in]ptrpointer to memory block
[in]sizenumber of bytes to clear
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool IsSigRlValid (GroupId const * gid,
SigRl const * sig_rl,
size_t sig_rl_size 
)
+
+ +

Function to verify if signature based revocation list is valid.

+
Parameters
+ + + + +
[in]gidGroup id
[in]sig_rlSignature based revocation list
[in]sig_rl_sizeSize of signature based revocation list
+
+
+
Returns
true if revocation list is valid
+
+false if revocation list is invalid
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int memcpy_S (void * dest,
size_t destsz,
void const * src,
size_t count 
)
+
+ +

Copies bytes between buffers with security ehancements.

+

Copies count bytes from src to dest. If the source and destination overlap, the behavior is undefined.

+
Parameters
+ + + + + +
[out]destpointer to the object to copy to
[in]destszmax number of bytes to modify in the destination (typically the size of the destination object)
[in]srcpointer to the object to copy from
[in]countnumber of bytes to copy
+
+
+
Returns
zero on success and non-zero value on error.
+

Copies bytes between buffers with security ehancements.

+
Note
Implementation follows C11 memcpy_s but with checks always enabled
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus SetCalculatedCommitValues (G1ElemStr const * B,
G1ElemStr const * K,
G1ElemStr const * T,
EcPoint const * R1,
EcGroupG1,
FfElement const * R2,
FiniteFieldGT,
CommitValuesvalues 
)
+
+ +

Set CommitValues structure fields calculated in algorithm.

+

Set B, K, T, R1 and R2 fields of values argument.

+
Parameters
+ + + + + + + + + +
[in]BValue of B to set
[in]KValue of K to set
[in]TValue of T to set
[in]R1Value of R1 to set
[in]G1EcGroup containing element R1
[in]R2Value of R2 to set
[in]GTFiniteField containing element R2
[out]valuesPointer to CommitValues structure to fill.
+
+
+
Returns
EpidStatus
+
See also
CalculateCommitmentHash
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
EpidStatus SetKeySpecificCommitValues (GroupPubKey const * pub_key,
CommitValuesvalues 
)
+
+ +

Set group public key related fields from CommitValues structure.

+

Set p, g1, g2, h1, h2 and w fields of values argument.

+
Parameters
+ + + +
[in]pub_keyGroup public key
[out]valuesPointer to CommitValues structure to fill.
+
+
+
Returns
EpidStatus
+
See also
CalculateCommitmentHash
+ +
+
+ +
+
+ + + + + + + + +
size_t StackGetSize (Stack const * stack)
+
+ +

Get number of elements in the stack.

+
Parameters
+ + +
[in]stackStack context
+
+
+
Returns
Number of elements in the stack or 0 if stack is NULL
+
See also
CreateStack
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool StackPopN (Stackstack,
size_t n,
void * elements 
)
+
+ +

Pop multiple elements from the stack.

+
Parameters
+ + + + +
[in,out]stackStack context
[in]nNumber of elements to pop from the stack
[out]elementsPointer to a buffer to store elements removed from the stack
+
+
+
Returns
true is operation succeed, false otherwise
+
See also
CreateStack
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void* StackPushN (Stackstack,
size_t n,
void * elements 
)
+
+ +

Push multiple elements to the stack.

+
Parameters
+ + + + +
[in,out]stackStack context
[in]nNumber of elements to push to the stack
[in]elementsArray 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 also
CreateStack
+ +
+
+
+
+ + + + + diff --git a/doc/html/group___epid_common.js b/doc/html/group___epid_common.js new file mode 100644 index 0000000..78783bc --- /dev/null +++ b/doc/html/group___epid_common.js @@ -0,0 +1,76 @@ +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" ], + [ "CommitValues", "struct_commit_values.html", [ + [ "B", "struct_commit_values.html#abc97167d51a8d0669da9a8d97353db4d", null ], + [ "g1", "struct_commit_values.html#a22512a6efa7b7b0277b211be64f71c30", null ], + [ "g2", "struct_commit_values.html#af7022c18732bbee8c12328923a4a12a1", null ], + [ "h1", "struct_commit_values.html#a42297d157420f0b554bce8a8cbe95c46", null ], + [ "h2", "struct_commit_values.html#a4a93cb984bac3de47bb60511b382a074", null ], + [ "K", "struct_commit_values.html#a49f073d0132a51020c0bfc819ec0d619", null ], + [ "p", "struct_commit_values.html#af5bf0f288e76f28ce54fe2df813881ef", null ], + [ "R1", "struct_commit_values.html#a00f7731d75085be08f171771c8f43d30", null ], + [ "R2", "struct_commit_values.html#acb0d12e761fadb149924cdf21290b9bf", null ], + [ "T", "struct_commit_values.html#ab2da47fe5c28b4202658c5ad3523ea1a", null ], + [ "w", "struct_commit_values.html#ac00af9d3eeb74543808a9e52e692f614", null ] + ] ], + [ "Epid2Params_", "struct_epid2_params__.html", [ + [ "Fp", "struct_epid2_params__.html#a45d742532485af7f34d43606a3f96b5d", null ], + [ "Fq", "struct_epid2_params__.html#a9cd99a40a7427666ff4b940ed69f69a0", null ], + [ "Fq2", "struct_epid2_params__.html#aebda3f9b5ed6f015adc992216bacf29f", null ], + [ "Fq6", "struct_epid2_params__.html#af3e9afc48ec8274f15d10f5f991c0937", null ], + [ "g1", "struct_epid2_params__.html#a337490f043e867b6c8d92180a9120541", null ], + [ "G1", "struct_epid2_params__.html#ade20ba985bc9219832df78ee9d255ee5", null ], + [ "g2", "struct_epid2_params__.html#a20dcfa40dba6679f45f1b90a91791a5c", null ], + [ "G2", "struct_epid2_params__.html#ae15ab066b26bbf1be8772743d604c766", null ], + [ "GT", "struct_epid2_params__.html#ac085cbd970d89fb382b621fb2884e420", null ], + [ "neg", "struct_epid2_params__.html#a1e50604a1739e48e8588d666d33d03ef", null ], + [ "p", "struct_epid2_params__.html#ad90e9f295e28d3f93852e87e97640e76", null ], + [ "pairing_state", "struct_epid2_params__.html#a74aa52f336a194b20627f8a540196dd5", null ], + [ "q", "struct_epid2_params__.html#a6d56c3f4dff7e92a0738e7866208bf4d", null ], + [ "t", "struct_epid2_params__.html#a4bca3d05a46b1325ac2490ebeb460543", null ], + [ "xi", "struct_epid2_params__.html#a51a678f0f26804e0c6f3a4c55fcf6731", null ] + ] ], + [ "GroupPubKey_", "struct_group_pub_key__.html", [ + [ "gid", "struct_group_pub_key__.html#afd2192bfd1e24c09951d9c0200a74f95", null ], + [ "h1", "struct_group_pub_key__.html#a2322bc1b42f85e0d01b50b15d064f840", null ], + [ "h2", "struct_group_pub_key__.html#a4d95b831d9a66071092678547df921ae", null ], + [ "w", "struct_group_pub_key__.html#a4d1537e5bd834b6fc92eb2fd7c826329", null ] + ] ], + [ "PrivKey_", "struct_priv_key__.html", [ + [ "A", "struct_priv_key__.html#aaf02af1379a0801f49a3f8845e7a1b1f", null ], + [ "f", "struct_priv_key__.html#a183eb6658baec9825313ab534608fa10", null ], + [ "gid", "struct_priv_key__.html#a0892f451bb967dd7c99fe1d926d5056f", null ], + [ "x", "struct_priv_key__.html#a327d7192cbb6b5638e3f6f1c3d9d2d5b", null ] + ] ], + [ "EPID_ENABLE_EPID_ZERO_MEMORY_ON_FREE", "group___epid_common.html#gab1587898f15de1b51cd5e799a43465ff", null ], + [ "ntohl", "group___epid_common.html#ga29a7e07cd5181e738f98fc026979efca", null ], + [ "SAFE_ALLOC", "group___epid_common.html#ga38fad13430eba25f9f9b05e35ecd22f8", null ], + [ "SAFE_FREE", "group___epid_common.html#ga2ca3c202ee727774d55890e568621842", null ], + [ "SAFE_REALLOC", "group___epid_common.html#ga41c113e15b695291199c27fac4bd53fa", null ], + [ "BitSupplier", "group___epid_common.html#ga6119a2c0323a3fca9e502b24bc378c2c", null ], + [ "CalculateCommitmentHash", "group___epid_common.html#ga23f8ea0f7529e8e7a81bd88e607dda01", null ], + [ "CreateEpid2Params", "group___epid_common.html#ga5c396a5ac8a0e5ec1e02330c53420dce", null ], + [ "CreateGroupPubKey", "group___epid_common.html#ga20a575d3d538b0bac654fd57f20e2b30", null ], + [ "CreatePrivKey", "group___epid_common.html#gae51985a0e811f4bbb2d70b62e35b881e", null ], + [ "CreateStack", "group___epid_common.html#ga00cb25d52726cef61a9a5266176c2a58", null ], + [ "DeleteEpid2Params", "group___epid_common.html#gac22664b5f7df5cd4da1bd7b1b1e7912f", null ], + [ "DeleteGroupPubKey", "group___epid_common.html#ga07c9b47d326ee784aecb78195adffb8b", null ], + [ "DeletePrivKey", "group___epid_common.html#ga53db100214e65e362fa426508a240d12", null ], + [ "DeleteStack", "group___epid_common.html#ga3335a4754825c54840263aa4b2a9bf67", null ], + [ "EpidAlloc", "group___epid_common.html#gada170fd890504b013139f4a33033ae4b", null ], + [ "EpidFree", "group___epid_common.html#gaeae76709e6bfc80c9d79ec4943ccc1ac", null ], + [ "EpidRealloc", "group___epid_common.html#ga6911838728d546e4a51d7bcb8404525c", null ], + [ "EpidZeroMemory", "group___epid_common.html#gad471f600f6032f432b99432fda97a070", null ], + [ "IsSigRlValid", "group___epid_common.html#ga23ec3f6c8b89eb63e04d2b1ec6fd2696", null ], + [ "memcpy_S", "group___epid_common.html#ga4856121ac4bce4161a015a8a2b4f5b1c", null ], + [ "SetCalculatedCommitValues", "group___epid_common.html#ga3f3c3b965dd714179cbc2f8d96678ee0", null ], + [ "SetKeySpecificCommitValues", "group___epid_common.html#ga2d54f4f222e965222024113c0420602d", null ], + [ "StackGetSize", "group___epid_common.html#gab34066dc882ad63362c43c0790973fdc", null ], + [ "StackPopN", "group___epid_common.html#ga8cdde2b366f4473f0a6965bcfea5b6a6", null ], + [ "StackPushN", "group___epid_common.html#ga0b4dedb867504e0148aa0e1fdf642b2b", 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..574d726 --- /dev/null +++ b/doc/html/group___epid_math.html @@ -0,0 +1,106 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: math + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
math
+
+
+ +

Math Primitives and Group Operations. +More...

+ + + + + + + + + + + + + + + + + + + + +

+Modules

 bignum
 Big number operations.
 
 ecdsa
 Elliptic Curve Digital Signature Algorithm Primitives.
 
 ecgroup
 Elliptic curve group operations.
 
 finitefield
 Finite field operations.
 
 hash
 Hash primitives.
 
 pairing
 Pairing operations.
 
+

Detailed Description

+

Math Primitives and Group Operations.

+

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

+
+
+ + + + + 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..898d1c9 --- /dev/null +++ b/doc/html/group___epid_member_module.html @@ -0,0 +1,933 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: member + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
member
+
+
+ +

Member functionality. +More...

+ + + + + + + + +

+Data Structures

struct  MemberPrecomp
 Pre-computed member settings. More...
 
struct  PreComputedSignature
 Pre-computed signature. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

EpidStatus EpidMemberCreate (GroupPubKey const *pub_key, PrivKey const *priv_key, MemberPrecomp const *precomp, BitSupplier rnd_func, void *rnd_param, MemberCtx **ctx)
 Creates a new member context. More...
 
void EpidMemberDelete (MemberCtx **ctx)
 Deletes an existing member context. More...
 
EpidStatus EpidMemberWritePrecomp (MemberCtx const *ctx, MemberPrecomp *precomp)
 Serializes the pre-computed member settings. More...
 
EpidStatus EpidMemberSetHashAlg (MemberCtx *ctx, HashAlg hash_alg)
 Sets the hash algorithm to be used by a member. More...
 
size_t EpidGetSigSize (SigRl const *sig_rl)
 Computes the size in bytes required for a Intel(R) EPID signature. More...
 
EpidStatus EpidSign (MemberCtx const *ctx, void const *msg, size_t msg_len, void const *basename, size_t basename_len, SigRl const *sig_rl, size_t sig_rl_size, EpidSignature *sig, size_t sig_len)
 Writes a Intel(R) EPID signature. More...
 
EpidStatus EpidRegisterBaseName (MemberCtx *ctx, void const *basename, size_t basename_len)
 Registers a basename with a member. More...
 
EpidStatus EpidAddPreSigs (MemberCtx *ctx, size_t number_presigs, PreComputedSignature *presigs)
 Extends the member's pool of pre-computed signatures. More...
 
size_t EpidGetNumPreSigs (MemberCtx const *ctx)
 Gets the number of pre-computed signatures in the member's pool. More...
 
EpidStatus EpidWritePreSigs (MemberCtx *ctx, PreComputedSignature *presigs, size_t number_presigs)
 Serializes pre-computed signatures from the member's pool. More...
 
EpidStatus EpidRequestJoin (GroupPubKey const *pub_key, IssuerNonce const *ni, FpElemStr const *f, BitSupplier rnd_func, void *rnd_param, HashAlg hash_alg, JoinRequest *join_request)
 Creates a request to join a group. More...
 
EpidStatus EpidSignBasic (MemberCtx const *ctx, void const *msg, size_t msg_len, void const *basename, size_t basename_len, BasicSignature *sig)
 Creates a basic signature for use in constrained environment. More...
 
EpidStatus EpidNrProve (MemberCtx const *ctx, void const *msg, size_t msg_len, BasicSignature const *sig, SigRlEntry const *sigrl_entry, NrProof *proof)
 Calculates a non-revoked proof for a single signature based revocation list entry. More...
 
bool EpidIsPrivKeyInGroup (GroupPubKey const *pub_key, PrivKey const *priv_key)
 Tests if a member private key is valid without checking revocation. More...
 
EpidStatus EpidDecompressPrivKey (GroupPubKey const *pub_key, CompressedPrivKey const *compressed_privkey, PrivKey *priv_key)
 Decompresses compressed member private key. More...
 
+

Detailed Description

+

Member functionality.

+

Defines the APIs needed by Intel(R) EPID members. Each member context (MemberCtx) represents membership in a single group.

+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidAddPreSigs (MemberCtxctx,
size_t number_presigs,
PreComputedSignaturepresigs 
)
+
+ +

Extends the member's pool of pre-computed signatures.

+

Can either generate new pre-computed signatures or import existing ones. EpidWritePreSigs can be used to export pre-computed signatures.

+
Parameters
+ + + + +
[in]ctxThe member context.
[in]number_presigsThe number of pre-computed signatures to add to the internal pool.
[in,out]presigsOptional array of valid pre-computed signatures to import. If presigs is not NULL it most contain at least number_presigs pre-computed signatures.
+
+
+
Returns
EpidStatus
+
Note
presigs buffer is zeroed out before return to prevent pre-computed signatures from being reused.
+
+If the result is not kEpidNoErr the state of the pre-computed signature pool, and of presigs, is undefined.
+
See also
EpidMemberCreate
+
+EpidWritePreSigs
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidDecompressPrivKey (GroupPubKey const * pub_key,
CompressedPrivKey const * compressed_privkey,
PrivKeypriv_key 
)
+
+ +

Decompresses compressed member private key.

+

Converts a compressed member private key into a member private key for use by other member APIs.

+
Parameters
+ + + + +
[in]pub_keyThe public key of the group.
[in]compressed_privkeyThe compressed member private key to be decompressed.
[out]priv_keyThe member private key.
+
+
+
Returns
EpidStatus
+
Examples:
signmsg.c.
+
+
+
+ +
+
+ + + + + + + + +
size_t EpidGetNumPreSigs (MemberCtx const * ctx)
+
+ +

Gets the number of pre-computed signatures in the member's pool.

+
Parameters
+ + +
[in]ctxThe member context.
+
+
+
Returns
Number of remaining pre-computed signatures. Returns 0 if ctx is NULL.
+
See also
EpidMemberCreate
+
+EpidWritePreSigs
+ +
+
+ +
+
+ + + + + + + + +
size_t EpidGetSigSize (SigRl const * sig_rl)
+
+ +

Computes the size in bytes required for a Intel(R) EPID signature.

+
Parameters
+ + +
[in]sig_rlThe 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 also
SigRl
+
Examples:
signmsg.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
bool EpidIsPrivKeyInGroup (GroupPubKey const * pub_key,
PrivKey const * priv_key 
)
+
+ +

Tests if a member private key is valid without checking revocation.

+

Used to check that a member private key is a valid key for a group. This is useful as a cross check when creating a new member private key as part of the join process

+
Parameters
+ + + +
[in]pub_keyThe public key of the group.
[in]priv_keyThe private key to check.
+
+
+
Returns
bool
+
Return values
+ + + +
trueif the private key is valid for the group of the public key
falseif the private key is not valid for the group of the public key
+
+
+
See also
EpidRequestJoin
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidMemberCreate (GroupPubKey const * pub_key,
PrivKey const * priv_key,
MemberPrecomp const * precomp,
BitSupplier rnd_func,
void * rnd_param,
MemberCtx ** ctx 
)
+
+ +

Creates a new member context.

+

Must be called to create the member context that is used by other "Member" APIs.

+

Allocates memory for the context, then initializes it.

+

EpidMemberDelete() must be called to safely release the member context.

+
Parameters
+ + + + + + + +
[in]pub_keyThe group certificate.
[in]priv_keyThe member private key.
[in]precompOptional pre-computed data. If NULL the value is computed internally and is readable using EpidMemberWritePrecomp().
[in]rnd_funcRandom number generator.
[in]rnd_paramPass through context data for rnd_func.
[out]ctxNewly constructed member context.
+
+
+
Returns
EpidStatus
+
Warning
For security rnd_func should be a cryptographically secure random number generator.
+
Note
If the result is not kEpidNoErr the content of ctx is undefined.
+
See also
EpidMemberDelete
+
+EpidMemberWritePrecomp
+
Examples:
signmsg.c.
+
+
+
+ +
+
+ + + + + + + + +
void EpidMemberDelete (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.

+
Parameters
+ + +
[in,out]ctxThe member context. Can be NULL.
+
+
+
See also
EpidMemberCreate
+
Examples:
signmsg.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
EpidStatus EpidMemberSetHashAlg (MemberCtxctx,
HashAlg hash_alg 
)
+
+ +

Sets the hash algorithm to be used by a member.

+
Parameters
+ + + +
[in]ctxThe member context.
[in]hash_algThe hash algorithm to use.
+
+
+
Returns
EpidStatus
+
Note
If the result is not kEpidNoErr, the hash algorithm used by the member is undefined.
+
See also
EpidMemberCreate
+
+HashAlg
+
Examples:
signmsg.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
EpidStatus EpidMemberWritePrecomp (MemberCtx const * ctx,
MemberPrecompprecomp 
)
+
+ +

Serializes the pre-computed member settings.

+
Parameters
+ + + +
[in]ctxThe member context.
[out]precompThe Serialized pre-computed member settings.
+
+
+
Returns
EpidStatus
+
Note
If the result is not kEpidNoErr, the content of precomp is undefined.
+
Examples:
signmsg.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidNrProve (MemberCtx const * ctx,
void const * msg,
size_t msg_len,
BasicSignature const * sig,
SigRlEntry const * sigrl_entry,
NrProofproof 
)
+
+ +

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.

+
Parameters
+ + + + + + + +
[in]ctxThe member context.
[in]msgThe message.
[in]msg_lenThe length of message in bytes.
[in]sigThe basic signature.
[in]sigrl_entryThe signature based revocation list entry.
[out]proofThe generated non-revoked proof.
+
+
+
Returns
EpidStatus
+
Note
This function should be used in conjunction with EpidSignBasic().
+
+If the result is not kEpidNoErr, the content of proof is undefined.
+
See also
EpidMemberCreate
+
+EpidSignBasic
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidRegisterBaseName (MemberCtxctx,
void const * basename,
size_t basename_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.
+
Parameters
+ + + + +
[in]ctxThe member context.
[in]basenameThe basename.
[in]basename_lenLength of the basename.
+
+
+
Returns
EpidStatus
+
Return values
+ + +
kEpidDuplicateErrThe basename was already registered.
+
+
+
Note
If the result is not kEpidNoErr or kEpidDuplicateErr it is undefined if the basename is registered.
+
Examples:
signmsg.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidRequestJoin (GroupPubKey const * pub_key,
IssuerNonce const * ni,
FpElemStr const * f,
BitSupplier rnd_func,
void * rnd_param,
HashAlg hash_alg,
JoinRequestjoin_request 
)
+
+ +

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.

+
Parameters
+ + + + + + + + +
[in]pub_keyThe group certificate of group to join.
[in]niThe nonce chosen by issuer as part of join protocol.
[in]fA randomly selected integer in [1, p-1].
[in]rnd_funcRandom number generator.
[in]rnd_paramPass through context data for rnd_func.
[in]hash_algThe hash algorithm to be used.
[out]join_requestThe join request.
+
+
+
Returns
EpidStatus
+
Warning
For security rnd_func should be a cryptographically secure random number generator.
+
Note
The default hash algorithm in Member is SHA-512. This is the recommended option if you do not override the hash algorithm elsewhere.
+
+If the result is not kEpidNoErr, the content of join_request is undefined.
+
See also
HashAlg
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidSign (MemberCtx const * ctx,
void const * msg,
size_t msg_len,
void const * basename,
size_t basename_len,
SigRl const * sig_rl,
size_t sig_rl_size,
EpidSignaturesig,
size_t sig_len 
)
+
+ +

Writes a Intel(R) EPID signature.

+
Parameters
+ + + + + + + + + + +
[in]ctxThe member context.
[in]msgThe message to sign.
[in]msg_lenThe length in bytes of message.
[in]basenameOptional 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.
[in]basename_lenThe size of basename in bytes. Must be 0 basename is NULL.
[in]sig_rlThe signature based revocation list.
[in]sig_rl_sizeThe size in bytes of the signature based revocation list.
[out]sigThe generated signature
[in]sig_lenThe 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 also
EpidMemberCreate
+
+EpidMemberSetHashAlg
+
+EpidGetSigSize
+
Examples:
signmsg.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidSignBasic (MemberCtx const * ctx,
void const * msg,
size_t msg_len,
void const * basename,
size_t basename_len,
BasicSignaturesig 
)
+
+ +

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.

+
Parameters
+ + + + + + + +
[in]ctxThe member context.
[in]msgThe message.
[in]msg_lenThe length of message in bytes.
[in]basenameOptional 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.
[in]basename_lenThe size of basename in bytes. Must be 0 basename is NULL.
[out]sigThe generated basic signature
+
+
+
Returns
EpidStatus
+
Note
This function should be used in conjunction with EpidNrProve()
+
+If the result is not kEpidNoErr the content of sig, is undefined.
+
See also
EpidMemberCreate
+
+EpidNrProve
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidWritePreSigs (MemberCtxctx,
PreComputedSignaturepresigs,
size_t number_presigs 
)
+
+ +

Serializes pre-computed signatures from the member's pool.

+

Removes requested number of pre-computed signatures from member's pool and stores them in presigs array. Use EpidAddPreSigs to add pre-computed signatures to the pool.

+
Parameters
+ + + + +
[in]ctxThe member context.
[out]presigsAn existing buffer of pre-computed signatures.
[in]number_presigsNumber of pre-computed signatures to read. Number_presigs must not be greater than the value returned by EpidGetNumPreSigs.
+
+
+
Returns
EpidStatus
+
Note
If the result is not kEpidNoErr the state of the pre-computed signature pool, and of presigs, is undefined.
+
See also
EpidMemberCreate
+
+EpidGetNumPreSigs
+
+EpidAddPreSigs
+ +
+
+
+
+ + + + + diff --git a/doc/html/group___epid_member_module.js b/doc/html/group___epid_member_module.js new file mode 100644 index 0000000..1a6c7f4 --- /dev/null +++ b/doc/html/group___epid_member_module.js @@ -0,0 +1,37 @@ +var group___epid_member_module = +[ + [ "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 ] + ] ], + [ "PreComputedSignature", "struct_pre_computed_signature.html", [ + [ "a", "struct_pre_computed_signature.html#af23f3f9693857a33fe8564644612ea37", null ], + [ "B", "struct_pre_computed_signature.html#a9cc2eb61572a1aca9e6bc3d5e6f4c1fe", null ], + [ "b", "struct_pre_computed_signature.html#a666710432d9d54ca896647a976892c4f", null ], + [ "K", "struct_pre_computed_signature.html#a2a4eaffe2717bd9c8c360599612adbe6", null ], + [ "R1", "struct_pre_computed_signature.html#a72be597624957e3d668c95ff6f445f94", null ], + [ "R2", "struct_pre_computed_signature.html#a79f06fb57842597372e00dd34c1a804a", null ], + [ "ra", "struct_pre_computed_signature.html#a54462643b8a2b4f2741bf8d2e6909d11", null ], + [ "rb", "struct_pre_computed_signature.html#a6a1db672c609943fe7af84320dc68ba3", null ], + [ "rf", "struct_pre_computed_signature.html#ac244bd559a96812bcee7671abc299b66", null ], + [ "rx", "struct_pre_computed_signature.html#acd0674d5b5e96244645e9abef7bdbddc", null ], + [ "T", "struct_pre_computed_signature.html#a73471643dc757115701833ca2e831a72", null ] + ] ], + [ "EpidAddPreSigs", "group___epid_member_module.html#gad2e3de5c6ce641a318f8a46b61e75236", 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 ], + [ "EpidIsPrivKeyInGroup", "group___epid_member_module.html#ga8e3f201d1e9dc668659e08a3bdf543b6", null ], + [ "EpidMemberCreate", "group___epid_member_module.html#ga561c4d544a78ee1bf59c3f4f919aa7bb", null ], + [ "EpidMemberDelete", "group___epid_member_module.html#ga3824589c683c5e0e59d483462fce65d6", null ], + [ "EpidMemberSetHashAlg", "group___epid_member_module.html#ga9998eb454838ff5d232ff22ecbab31bf", null ], + [ "EpidMemberWritePrecomp", "group___epid_member_module.html#ga5c35798d62cf81c4ca62b22c38809721", null ], + [ "EpidNrProve", "group___epid_member_module.html#gac8e2c6c1fead8030785a40427905a2cc", null ], + [ "EpidRegisterBaseName", "group___epid_member_module.html#gad92d3c3266ae1833ffb1dba9ad76035d", null ], + [ "EpidRequestJoin", "group___epid_member_module.html#ga13dd0d72be9babf8194d472d7712a361", null ], + [ "EpidSign", "group___epid_member_module.html#ga759155a719254f734157722716dac640", null ], + [ "EpidSignBasic", "group___epid_member_module.html#gae04a250d5981fcf9bd6f9f57e0468faa", null ], + [ "EpidWritePreSigs", "group___epid_member_module.html#ga9e12c7cec8d0c4e07b12c0e26a278c9d", 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..3b36d18 --- /dev/null +++ b/doc/html/group___epid_module.html @@ -0,0 +1,97 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
epid
+
+
+ +

Core Intel® EPID functionality. +More...

+ + + + + + + + + + + +

+Modules

 common
 Common code shared between core sub-components.
 
 member
 Member functionality.
 
 verifier
 Verifier functionality.
 
+

Detailed Description

+

Core Intel® EPID functionality.

+

Contains core functionality used to provide or implement APIs in the Intel(R) EPID SDK.

+
+
+ + + + + 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..f4b0a4d --- /dev/null +++ b/doc/html/group___epid_print.html @@ -0,0 +1,660 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: print_utils + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
print_utils
+
+
+ +

Debug print routines. +More...

+ + + + + +

+Enumerations

enum  PrintUtilFormat { kPrintUtilUnannotated = 0, +kPrintUtilAnnotated = 1 + }
 Print format. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

void PrintBigNum (BigNum const *big_num, char const *var_name)
 Prints BigNum. More...
 
void PrintFfElement (FiniteField const *ff, FfElement const *ff_element, char const *var_name, PrintUtilFormat format)
 Prints finite field element. More...
 
void PrintEcPoint (EcGroup const *g, EcPoint const *ec_point, char const *var_name, PrintUtilFormat format)
 Prints elliptic curve group element. More...
 
void PrintBigNumStr (BigNumStr const *big_num_str, char const *var_name)
 Prints serialized BigNum. More...
 
void PrintFpElemStr (FpElemStr const *fp_elem_str, char const *var_name)
 Prints serialized Fp element. More...
 
void PrintFqElemStr (FqElemStr const *fq_elem_str, char const *var_name)
 Prints serialized Fq element. More...
 
void PrintFq2ElemStr (Fq2ElemStr const *fq2_elem_str, char const *var_name, PrintUtilFormat format)
 Prints serialized Fq2 element. More...
 
void PrintFq6ElemStr (Fq6ElemStr const *fq6_elem_str, char const *var_name, PrintUtilFormat format)
 Prints serialized Fq6 element. More...
 
void PrintFq12ElemStr (Fq12ElemStr const *fq12_elem_str, char const *var_name, PrintUtilFormat format)
 Prints serialized Fq12 element. More...
 
void PrintG1ElemStr (G1ElemStr const *g1_elem_str, char const *var_name, PrintUtilFormat format)
 Prints serialized G1 element. More...
 
void PrintG2ElemStr (G2ElemStr const *g2_elem_str, char const *var_name, PrintUtilFormat format)
 Prints serialized G2 element. More...
 
void PrintGtElemStr (GtElemStr const *gt_elem_str, char const *var_name, PrintUtilFormat format)
 Prints serialized Gt element. More...
 
+

Detailed Description

+

Debug print routines.

+

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.

+

Enumeration Type Documentation

+ +
+
+ + + + +
enum PrintUtilFormat
+
+ +

Print format.

+ + + +
Enumerator
kPrintUtilUnannotated  +

Unannotated output format.

+
kPrintUtilAnnotated  +

Annotated output format.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
void PrintBigNum (BigNum const * big_num,
char const * var_name 
)
+
+ +

Prints BigNum.

+

Macro EPID_ENABLE_DEBUG_PRINT needs to be defined in order to activate this routine; otherwise, it prints nothing.

+
Parameters
+ + + +
[in]big_numBigNum to be printed
[in]var_nameResult variable name
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void PrintBigNumStr (BigNumStr const * big_num_str,
char const * var_name 
)
+
+ +

Prints serialized BigNum.

+

Macro EPID_ENABLE_DEBUG_PRINT needs to be defined in order to activate this routine; otherwise, it prints nothing.

+
Parameters
+ + + +
[in]big_num_strSerialized BigNum to be printed
[in]var_nameResult variable name
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void PrintEcPoint (EcGroup const * g,
EcPoint const * ec_point,
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.

+
Parameters
+ + + + + +
[in]gElliptic curve group that element to be printed belongs to
[in]ec_pointElliptic curve group element to be printed
[in]var_nameResult variable name
[in]formatOutput format
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void PrintFfElement (FiniteField const * ff,
FfElement const * ff_element,
char const * var_name,
PrintUtilFormat format 
)
+
+ +

Prints finite field element.

+

Macro EPID_ENABLE_DEBUG_PRINT needs to be defined in order to activate this routine; otherwise, it prints nothing.

+
Parameters
+ + + + + +
[in]ffFinite field that element to be printed belongs to
[in]ff_elementFinite field element to be printed
[in]var_nameResult variable name
[in]formatOutput format
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void PrintFpElemStr (FpElemStr const * fp_elem_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.

+
Parameters
+ + + +
[in]fp_elem_strSerialized Fp element to be printed
[in]var_nameResult variable name
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void PrintFq12ElemStr (Fq12ElemStr const * fq12_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.

+
Parameters
+ + + + +
[in]fq12_elem_strSerialized Intel(R) EPID Fq12 element to be printed
[in]var_nameResult variable name
[in]formatOutput format
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void PrintFq2ElemStr (Fq2ElemStr const * fq2_elem_str,
char const * var_name,
PrintUtilFormat format 
)
+
+ +

Prints serialized Fq2 element.

+

Macro EPID_ENABLE_DEBUG_PRINT needs to be defined in order to activate this routine; otherwise, it prints nothing.

+
Parameters
+ + + + +
[in]fq2_elem_strSerialized Fq2 element to be printed
[in]var_nameResult variable name
[in]formatOutput format
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void PrintFq6ElemStr (Fq6ElemStr const * fq6_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.

+
Parameters
+ + + + +
[in]fq6_elem_strSerialized Fq6 element to be printed
[in]var_nameResult variable name
[in]formatOutput format
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void PrintFqElemStr (FqElemStr const * fq_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.

+
Parameters
+ + + +
[in]fq_elem_strSerialized Fq element to be printed
[in]var_nameResult variable name
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void PrintG1ElemStr (G1ElemStr const * g1_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.

+
Parameters
+ + + + +
[in]g1_elem_strSerialized G1 element to be printed
[in]var_nameResult variable name
[in]formatOutput format
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void PrintG2ElemStr (G2ElemStr const * g2_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.

+
Parameters
+ + + + +
[in]g2_elem_strSerialized G2 element to be printed
[in]var_nameResult variable name
[in]formatOutput format
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void PrintGtElemStr (GtElemStr const * gt_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.

+
Parameters
+ + + + +
[in]gt_elem_strSerialized G2 element to be printed
[in]var_nameResult variable name
[in]formatOutput format
+
+
+ +
+
+
+
+ + + + + diff --git a/doc/html/group___epid_print.js b/doc/html/group___epid_print.js new file mode 100644 index 0000000..00d8c84 --- /dev/null +++ b/doc/html/group___epid_print.js @@ -0,0 +1,19 @@ +var group___epid_print = +[ + [ "PrintUtilFormat", "group___epid_print.html#ga3e215d157eb205ad596bb84bce694a83", [ + [ "kPrintUtilUnannotated", "group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83aeb475b793d8d357087d7fcc74702ffae", null ], + [ "kPrintUtilAnnotated", "group___epid_print.html#gga3e215d157eb205ad596bb84bce694a83ae2d5345c14f57fc992a613003c3c443d", 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..efdfd1d --- /dev/null +++ b/doc/html/group___epid_types.html @@ -0,0 +1,266 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: types + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+ +
+ +

SDK data types. +More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Data Structures

struct  OctStr8
 8 bit octet string More...
 
struct  OctStr16
 16 bit octet string More...
 
struct  OctStr32
 32 bit octet string More...
 
struct  OctStr64
 64 bit octet string More...
 
struct  OctStr128
 128 bit octet string More...
 
struct  OctStr256
 256 bit octet string More...
 
struct  OctStr512
 512 bit octet string More...
 
struct  BigNumStr
 Serialized BigNum. More...
 
struct  FpElemStr
 a number in [0, p-1] More...
 
struct  FqElemStr
 a number in [0, q-1] More...
 
struct  G1ElemStr
 Serialized G1 element. More...
 
struct  G2ElemStr
 Serialized G2 element. More...
 
struct  GtElemStr
 Serialized GT element. More...
 
struct  Epid2Params
 Intel(R) EPID 2.0 Parameters. More...
 
struct  GroupPubKey
 Intel(R) EPID 2.0 group public key. More...
 
struct  IPrivKey
 Intel(R) EPID 2.0 issuing private key. More...
 
struct  PrivKey
 Intel(R) EPID 2.0 private key. More...
 
struct  CompressedPrivKey
 Compressed private key. More...
 
struct  MembershipCredential
 Membership credential. More...
 
struct  JoinRequest
 Join request. More...
 
struct  BasicSignature
 Intel(R) EPID 2.0 basic signature. More...
 
struct  NrProof
 non-revoked Proof. More...
 
struct  EpidSignature
 Intel(R) EPID 2.0 Signature. More...
 
struct  PrivRl
 private-key based revocation list. More...
 
struct  SigRlEntry
 entry in SigRL (B,K) More...
 
struct  SigRl
 signature based revocation list More...
 
struct  GroupRl
 group revocation list More...
 
struct  VerifierRl
 
struct  Fq2ElemStr
 Serialized Fq2 element. More...
 
struct  Fq6ElemStr
 Serialized Fq2^3 element. More...
 
struct  Fq12ElemStr
 Serialized Fq2^3^2 element. More...
 
struct  EcdsaSignature
 ECDSA Signature using NIST 256-bit curve secp256r1. More...
 
struct  EcdsaPublicKey
 ECDSA Public Key. More...
 
struct  EcdsaPrivateKey
 ECDSA Private Key. More...
 
+ + + + + + + + + + + + + +

+Typedefs

+typedef OctStr128 GroupId
 group ID
 
+typedef OctStr256 Seed
 256 bit seed derived from fuse key
 
+typedef OctStr256 IssuerNonce
 256 bit nonce chosen by issuer
 
+typedef G1ElemStr ReKeySeed
 element to store seed values for later rekey
 
+ + + + +

+Enumerations

enum  HashAlg {
+  kSha256 = 0, +kSha384 = 1, +kSha512 = 2, +kSha512_256 = 3, +
+  kSha3_256 = 4, +kSha3_384 = 5, +kSha3_512 = 6 +
+ }
 Recognized hash algorithms. More...
 
+

Detailed Description

+

SDK data 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 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.

+

Enumeration Type Documentation

+ +
+
+ + + + +
enum HashAlg
+
+ +

Recognized hash algorithms.

+ + + + + + + + +
Enumerator
kSha256  +

SHA-256.

+
kSha384  +

SHA-384.

+
kSha512  +

SHA-512.

+
kSha512_256  +

SHA-512/256.

+
kSha3_256  +

Reserved for SHA3/256.

+
kSha3_384  +

Reserved for SHA3/384.

+
kSha3_512  +

Reserved for SHA3/512.

+
+ +
+
+
+
+ + + + + diff --git a/doc/html/group___epid_types.js b/doc/html/group___epid_types.js new file mode 100644 index 0000000..f473312 --- /dev/null +++ b/doc/html/group___epid_types.js @@ -0,0 +1,169 @@ +var group___epid_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 ] + ] ], + [ "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 ] + ] ], + [ "GroupId", "group___epid_types.html#gada666b48d0cbc301985405fde896f1de", null ], + [ "IssuerNonce", "group___epid_types.html#ga55eb2193045bde31af3f551565126042", null ], + [ "ReKeySeed", "group___epid_types.html#ga54bd22670f2e348593db7ab631131d10", null ], + [ "Seed", "group___epid_types.html#ga888541b8148df69c634a92c64ed51317", null ], + [ "HashAlg", "group___epid_types.html#ga5e450438f6f9a5eacd0cf5ce354ec890", [ + [ "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..1e2f5d1 --- /dev/null +++ b/doc/html/group___epid_verifier_module.html @@ -0,0 +1,834 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: verifier + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
verifier
+
+
+ +

Verifier functionality. +More...

+ + + + + +

+Data Structures

struct  VerifierPrecomp
 Pre-computed member settings. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

EpidStatus EpidVerifierCreate (GroupPubKey const *pub_key, VerifierPrecomp const *precomp, VerifierCtx **ctx)
 Creates a new verifier context. More...
 
void EpidVerifierDelete (VerifierCtx **ctx)
 Deletes an existing verifier context. More...
 
EpidStatus EpidVerifierWritePrecomp (VerifierCtx const *ctx, VerifierPrecomp *precomp)
 Serializes the pre-computed verifier settings. More...
 
EpidStatus EpidVerifierSetPrivRl (VerifierCtx *ctx, PrivRl const *priv_rl, size_t priv_rl_size)
 Sets the private key based revocation list. More...
 
EpidStatus EpidVerifierSetSigRl (VerifierCtx *ctx, SigRl const *sig_rl, size_t sig_rl_size)
 Sets the signature based revocation list. More...
 
EpidStatus EpidVerifierSetGroupRl (VerifierCtx *ctx, GroupRl const *grp_rl, size_t grp_rl_size)
 Sets the group based revocation list. More...
 
EpidStatus EpidVerifierSetVerifierRl (VerifierCtx *ctx, VerifierRl const *ver_rl, size_t ver_rl_size)
 Sets the verifier revocation list. More...
 
EpidStatus EpidVerifierSetHashAlg (VerifierCtx *ctx, HashAlg hash_alg)
 Sets the hash algorithm to be used by a verifier. More...
 
EpidStatus EpidVerify (VerifierCtx const *ctx, EpidSignature const *sig, size_t sig_len, void const *msg, size_t msg_len, void const *basename, size_t basename_len)
 Verifies a signature and checks revocation status. More...
 
bool EpidAreSigsLinked (BasicSignature const *sig1, BasicSignature const *sig2)
 Determines if two signatures are linked. More...
 
EpidStatus EpidVerifyBasicSig (VerifierCtx const *ctx, BasicSignature const *sig, void const *msg, size_t msg_len, void const *basename, size_t basename_len)
 Verifies a member signature without revocation checks. More...
 
EpidStatus EpidNrVerify (VerifierCtx const *ctx, BasicSignature const *sig, void const *msg, size_t msg_len, SigRlEntry const *sigrl_entry, NrProof const *proof)
 Verifies the non-revoked proof for a single signature based revocation list entry. More...
 
EpidStatus EpidCheckPrivRlEntry (VerifierCtx const *ctx, BasicSignature const *sig, FpElemStr const *f)
 Verifies a signature has not been revoked in the private key based revocation list. More...
 
+

Detailed Description

+

Verifier functionality.

+

Defines the APIs needed by Intel(R) EPID verifiers. Each verifier context (VerifierCtx) represents a verifier for a single group.

+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
bool EpidAreSigsLinked (BasicSignature const * sig1,
BasicSignature const * sig2 
)
+
+ +

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.

+
Parameters
+ + + +
[in]sig1A basic signature.
[in]sig2A basic signature.
+
+
+
Returns
bool
+
Return values
+ + + +
trueif the signatures were generated by the same member
falseif 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 also
EpidVerifyBasicSig
+
+EpidSignBasic
+
+EpidSign
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidCheckPrivRlEntry (VerifierCtx const * ctx,
BasicSignature const * sig,
FpElemStr const * f 
)
+
+ +

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.

+
Parameters
+ + + + +
[in]ctxThe verifier context.
[in]sigThe basic signature.
[in]fThe private key based revocation list entry.
+
+
+
Note
Sig should be verified using EpidVerifyBasicSig() before invocation. Behavior is undefined if sig cannot be verified.
+
+This function should be used in conjunction with EpidNrVerify() and EpidVerifyBasicSig().
+
+If the result is not kEpidNoErr the verify should be considered to have failed.
+
Returns
EpidStatus
+
See also
EpidVerifierCreate
+
+EpidNrVerify
+
+EpidVerifyBasicSig
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidNrVerify (VerifierCtx const * ctx,
BasicSignature const * sig,
void const * msg,
size_t msg_len,
SigRlEntry const * sigrl_entry,
NrProof const * proof 
)
+
+ +

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.

+
Parameters
+ + + + + + + +
[in]ctxThe verifier context.
[in]sigThe basic signature.
[in]msgThe message that was signed.
[in]msg_lenThe size of msg in bytes.
[in]sigrl_entryThe signature based revocation list entry.
[in]proofThe non-revoked proof.
+
+
+
Returns
EpidStatus
+
Note
Sig should be verified using EpidVerifyBasicSig() before invocation. Behavior is undefined if sig cannot be verified.
+
+This function should be used in conjunction with EpidVerifyBasicSig() and EpidCheckPrivRlEntry().
+
+If the result is not kEpidNoErr, the verification should be considered to have failed.
+
See also
EpidVerifierCreate
+
+EpidVerifyBasicSig
+
+EpidCheckPrivRlEntry
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidVerifierCreate (GroupPubKey const * pub_key,
VerifierPrecomp const * precomp,
VerifierCtx ** ctx 
)
+
+ +

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.

+
Parameters
+ + + + +
[in]pub_keyThe group certificate.
[in]precompOptional pre-computed data. If NULL the value is computed internally and is readable using EpidVerifierWritePrecomp().
[out]ctxNewly constructed verifier context.
+
+
+
Returns
EpidStatus
+
Note
If the result is not kEpidNoErr the content of ctx is undefined.
+
See also
EpidVerifierDelete
+
+EpidVerifierWritePrecomp
+
Examples:
verifysig.c.
+
+
+
+ +
+
+ + + + + + + + +
void EpidVerifierDelete (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.

+
Parameters
+ + +
[in,out]ctxThe verifier context. Can be NULL.
+
+
+
See also
EpidVerifierCreate
+
Examples:
verifysig.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidVerifierSetGroupRl (VerifierCtxctx,
GroupRl const * grp_rl,
size_t grp_rl_size 
)
+
+ +

Sets the group based revocation list.

+

The caller is responsible for insuring 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.
+
+It is the responsibility of the caller to free the memory pointed to by grp_rl after the verifier is no longer using it.
+
Parameters
+ + + + +
[in,out]ctxThe verifier context.
[in]grp_rlThe group based revocation list.
[in]grp_rl_sizeThe 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 also
EpidVerifierCreate
+
Examples:
verifysig.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
EpidStatus EpidVerifierSetHashAlg (VerifierCtxctx,
HashAlg hash_alg 
)
+
+ +

Sets the hash algorithm to be used by a verifier.

+
Parameters
+ + + +
[in]ctxThe verifier context.
[in]hash_algThe hash algorithm to use.
+
+
+
Returns
EpidStatus
+
Note
If the result is not kEpidNoErr, the hash algorithm used by the verifier is undefined.
+
See also
EpidVerifierCreate
+
+HashAlg
+
Examples:
verifysig.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidVerifierSetPrivRl (VerifierCtxctx,
PrivRl const * priv_rl,
size_t priv_rl_size 
)
+
+ +

Sets the private key based revocation list.

+

The caller is responsible for insuring 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.
+
+It is the responsibility of the caller to free the memory pointed to by priv_rl after the verifier is no longer using it.
+
Parameters
+ + + + +
[in,out]ctxThe verifier context.
[in]priv_rlThe private key based revocation list.
[in]priv_rl_sizeThe 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 also
EpidVerifierCreate
+
Examples:
verifysig.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidVerifierSetSigRl (VerifierCtxctx,
SigRl const * sig_rl,
size_t sig_rl_size 
)
+
+ +

Sets the signature based revocation list.

+

The caller is responsible for insuring 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.
+
+It is the responsibility of the caller to free the memory pointed to by sig_rl after the verifier is no longer using it.
+
Parameters
+ + + + +
[in,out]ctxThe verifier context.
[in]sig_rlThe signature based revocation list.
[in]sig_rl_sizeThe 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 also
EpidVerifierCreate
+
Examples:
verifysig.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidVerifierSetVerifierRl (VerifierCtxctx,
VerifierRl const * ver_rl,
size_t ver_rl_size 
)
+
+ +

Sets the verifier revocation list.

+

The caller is responsible for insuring 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 ver_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.
+
+It is the responsibility of the caller to free the memory pointed to by ver_rl after the verifier is no longer using it.
+
Parameters
+ + + + +
[in,out]ctxThe verifier context.
[in]ver_rlThe verifier revocation list.
[in]ver_rl_sizeThe 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 also
EpidVerifierCreate
+
Examples:
verifysig.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
EpidStatus EpidVerifierWritePrecomp (VerifierCtx const * ctx,
VerifierPrecompprecomp 
)
+
+ +

Serializes the pre-computed verifier settings.

+
Parameters
+ + + +
[in]ctxThe verifier context.
[out]precompThe Serialized pre-computed verifier settings.
+
+
+
Returns
EpidStatus
+
Note
If the result is not kEpidNoErr the content of precomp is undefined.
+
Examples:
verifysig.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidVerify (VerifierCtx const * ctx,
EpidSignature const * sig,
size_t sig_len,
void const * msg,
size_t msg_len,
void const * basename,
size_t basename_len 
)
+
+ +

Verifies a signature and checks revocation status.

+
Parameters
+ + + + + + + + +
[in]ctxThe verifier context.
[in]sigThe signature.
[in]sig_lenThe size of sig in bytes.
[in]msgThe message that was signed.
[in]msg_lenThe size of msg in bytes.
[in]basenameThe basename. Pass NULL if not specified
[in]basename_lenNumber of bytes in basename buffer. Must be 0 if basename is NULL.
+
+
+
Returns
EpidStatus
+
Return values
+ + + + + + + +
kEpidSigValidSignature validated successfully
kEpidSigInvalidSignature is invalid
kEpidSigRevokedinGroupRlSignature revoked in GroupRl
kEpidSigRevokedinPrivRlSignature revoked in PrivRl
kEpidSigRevokedinSigRlSignature revoked in SigRl
kEpidSigRevokedinVerifierRlSignature 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 also
EpidVerifierCreate
+
+EpidSignBasic
+
+EpidSign
+
Examples:
verifysig.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidVerifyBasicSig (VerifierCtx const * ctx,
BasicSignature const * sig,
void const * msg,
size_t msg_len,
void const * basename,
size_t basename_len 
)
+
+ +

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.

+
Parameters
+ + + + + + + +
[in]ctxThe verifier context.
[in]sigThe basic signature.
[in]msgThe message that was signed.
[in]msg_lenThe size of msg in bytes.
[in]basenameThe basename. Pass NULL if not specified
[in]basename_lenNumber of bytes in basename buffer. Must be 0 if basename is NULL.
+
+
+
Returns
EpidStatus
+
Note
This function should be used in conjunction with EpidNrVerify() and EpidCheckPrivRlEntry().
+
+If the result is not kEpidNoErr the verify should be considered to have failed.
+
See also
EpidVerifierCreate
+
+EpidSignBasic
+
+EpidSign
+ +
+
+
+
+ + + + + diff --git a/doc/html/group___epid_verifier_module.js b/doc/html/group___epid_verifier_module.js new file mode 100644 index 0000000..cabf2b5 --- /dev/null +++ b/doc/html/group___epid_verifier_module.js @@ -0,0 +1,22 @@ +var group___epid_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 ] + ] ], + [ "EpidAreSigsLinked", "group___epid_verifier_module.html#gae44bd8acbc1e7205aeedff0c7e2632a8", null ], + [ "EpidCheckPrivRlEntry", "group___epid_verifier_module.html#gaeb05e6faea6f09c0665b13adc6e7ddea", 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 ], + [ "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#ga39b240a17f310894e9f5946c9a731798", null ], + [ "EpidVerifyBasicSig", "group___epid_verifier_module.html#ga974b92a62e8b65ea75cf802e8cc6bb6a", 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..557e3e7 --- /dev/null +++ b/doc/html/group___error_codes.html @@ -0,0 +1,225 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: errors + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
errors
+
+
+ +

Error reporting interface. +More...

+ + + + + +

+Enumerations

enum  EpidStatus {
+  kEpidNoErr = 0, +kEpidSigValid = 0, +kEpidSigInvalid = 1, +kEpidSigRevokedinGroupRl = 2, +
+  kEpidSigRevokedinPrivRl = 3, +kEpidSigRevokedinSigRl = 4, +kEpidSigRevokedinVerifierRl = 5, +kEpidErr = -999, +
+  kEpidNotImpl, +kEpidBadArgErr, +kEpidNoMemErr, +kEpidMemAllocErr, +
+  kEpidMathErr, +kEpidDivByZeroErr, +kEpidUnderflowErr, +kEpidHashAlgorithmNotSupported, +
+  kEpidRandMaxIterErr, +kEpidDuplicateErr +
+ }
 Return status for SDK functions. More...
 
+ + + + +

+Functions

char const * EpidStatusToString (EpidStatus e)
 Returns string representation of error code. More...
 
+

Detailed Description

+

Error reporting interface.

+

This module defines the return status type. It also provides tools for interactions with status values, such as converting them to a string.

+

Enumeration Type Documentation

+ +
+
+ + + + +
enum EpidStatus
+
+ +

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"
  • +
+ + + + + + + + + + + + + + + + + + + +
Enumerator
kEpidNoErr  +

no error

+
kEpidSigValid  +

Signature is valid.

+
kEpidSigInvalid  +

Signature is invalid.

+
kEpidSigRevokedinGroupRl  +

Signature revoked in GroupRl.

+
kEpidSigRevokedinPrivRl  +

Signature revoked in PrivRl.

+
kEpidSigRevokedinSigRl  +

Signature revoked in SigRl.

+
kEpidSigRevokedinVerifierRl  +

Signature revoked in VerifierRl.

+
kEpidErr  +

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

+
+
Examples:
verifysig.c.
+
+
+
+

Function Documentation

+ +
+
+ + + + + + + + +
char const* EpidStatusToString (EpidStatus e)
+
+ +

Returns string representation of error code.

+
Parameters
+ + +
eThe status value.
+
+
+
Returns
The string describing the status.
+ +
+
+
+
+ + + + + diff --git a/doc/html/group___error_codes.js b/doc/html/group___error_codes.js new file mode 100644 index 0000000..6121a1d --- /dev/null +++ b/doc/html/group___error_codes.js @@ -0,0 +1,24 @@ +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#ggafdb27c77c2c4b32c807e326a8a0da360a2b38f44424cecd7b432194a2012dc9c7", null ], + [ "kEpidSigRevokedinPrivRl", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360a780a20821863553b88ca617a6fc0f718", null ], + [ "kEpidSigRevokedinSigRl", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360aff83186b61d48f9fee5f691c5b219bc1", null ], + [ "kEpidSigRevokedinVerifierRl", "group___error_codes.html#ggafdb27c77c2c4b32c807e326a8a0da360addbba767bb884b4459a567056b4d3f86", 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 ] + ] ], + [ "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..70cd3af --- /dev/null +++ b/doc/html/group___file_parser.html @@ -0,0 +1,439 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: fileparser + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+ +
+ +

Parser for issuer material. +More...

+ + + + + + + + +

+Data Structures

struct  EpidFileHeader
 Intel(R) EPID binary file header. More...
 
struct  EpidCaCertificate
 IoT CA Certificate binary format. More...
 
+ + + + +

+Enumerations

enum  EpidFileType {
+  kIssuingCaPubKeyFile, +kGroupPubKeyFile, +kPrivRlFile, +kSigRlFile, +
+  kGroupRlFile, +kPrivRlRequestFile, +kSigRlRequestFile, +kGroupRlRequestFile, +
+  kNumFileTypes +
+ }
 Recognized Intel(R) EPID file types. More...
 
+ + + + + + + + + + + + + +

+Functions

EpidStatus EpidParseGroupPubKeyFile (void const *buf, size_t len, EpidCaCertificate const *cert, GroupPubKey *pubkey)
 Extracts group public key from buffer in issuer binary format. More...
 
EpidStatus EpidParsePrivRlFile (void const *buf, size_t len, EpidCaCertificate const *cert, PrivRl *rl, size_t *rl_len)
 Extracts private key revocation list from buffer in issuer binary format. More...
 
EpidStatus EpidParseSigRlFile (void const *buf, size_t len, EpidCaCertificate const *cert, SigRl *rl, size_t *rl_len)
 Extracts signature revocation list from buffer in issuer binary format. More...
 
EpidStatus EpidParseGroupRlFile (void const *buf, size_t len, EpidCaCertificate const *cert, GroupRl *rl, size_t *rl_len)
 Extracts group revocation list from buffer in issuer binary format. More...
 
+ + + + +

+Variables

+const OctStr16 kEpidFileTypeCode [kNumFileTypes]
 Encoding of issuer material file types.
 
+

Detailed Description

+

Parser for issuer material.

+

Provides an API for parsing buffers formatted according to the various IoT Intel(R) EPID binary file formats.

+

Enumeration Type Documentation

+ +
+
+ + + + +
enum EpidFileType
+
+ +

Recognized Intel(R) EPID file types.

+ + + + + + + + + + +
Enumerator
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.

+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidParseGroupPubKeyFile (void const * buf,
size_t len,
EpidCaCertificate const * cert,
GroupPubKeypubkey 
)
+
+ +

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.
+
Parameters
+ + + + + +
[in]bufPointer to buffer containing public key to extract.
[in]lenThe size of buf in bytes.
[in]certThe issuing CA public key certificate.
[out]pubkeyThe extracted group public key.
+
+
+
Returns
EpidStatus
+
Return values
+ + +
kEpidSigInvalidParsing failed due to data authentication failure.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidParseGroupRlFile (void const * buf,
size_t len,
EpidCaCertificate const * cert,
GroupRlrl,
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.
+
Parameters
+ + + + + + +
[in]bufPointer to buffer containing the revocation list to extract.
[in]lenThe size of buf in bytes.
[in]certThe issuing CA public key certificate.
[out]rlThe extracted revocation list. If Null, rl_len is filled with the required output buffer size.
[in,out]rl_lenThe size of rl in bytes.
+
+
+
Returns
EpidStatus
+
Return values
+ + +
kEpidSigInvalidParsing failed due to data authentication failure.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidParsePrivRlFile (void const * buf,
size_t len,
EpidCaCertificate const * cert,
PrivRlrl,
size_t * rl_len 
)
+
+ +

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.
+
Parameters
+ + + + + + +
[in]bufPointer to buffer containing the revocation list to extract.
[in]lenThe size of buf in bytes.
[in]certThe issuing CA public key certificate.
[out]rlThe extracted revocation list. If Null, rl_len is filled with the required output buffer size.
[in,out]rl_lenThe size of rl in bytes.
+
+
+
Returns
EpidStatus
+
Return values
+ + +
kEpidSigInvalidParsing failed due to data authentication failure.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus EpidParseSigRlFile (void const * buf,
size_t len,
EpidCaCertificate const * cert,
SigRlrl,
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.
+
Parameters
+ + + + + + +
[in]bufPointer to buffer containing the revocation list to extract.
[in]lenThe size of buf in bytes.
[in]certThe issuing CA public key certificate.
[out]rlThe extracted revocation list. If Null, rl_len is filled with the required output buffer size.
[in,out]rl_lenThe size of rl in bytes.
+
+
+
Returns
EpidStatus
+
Return values
+ + +
kEpidSigInvalidParsing failed due to data authentication failure.
+
+
+ +
+
+
+
+ + + + + diff --git a/doc/html/group___file_parser.js b/doc/html/group___file_parser.js new file mode 100644 index 0000000..0d7346c --- /dev/null +++ b/doc/html/group___file_parser.js @@ -0,0 +1,34 @@ +var group___file_parser = +[ + [ "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 ] + ] ], + [ "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 ] +]; \ 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..1c40c12 --- /dev/null +++ b/doc/html/group___finite_field_primitives.html @@ -0,0 +1,1048 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: finitefield + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
finitefield
+
+
+ +

Finite field operations. +More...

+ + + + + + + + +

+Typedefs

+typedef struct FiniteField FiniteField
 A finite field.
 
+typedef struct FfElement FfElement
 An element in a finite field.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

EpidStatus NewFiniteField (BigNumStr const *prime, FiniteField **ff)
 Creates new finite field. More...
 
EpidStatus NewFiniteFieldViaBinomalExtension (FiniteField const *ground_field, FfElement const *ground_element, int degree, FiniteField **ff)
 Creates a new finite field using binomial extension. More...
 
void DeleteFiniteField (FiniteField **ff)
 Frees a previously allocated FiniteField. More...
 
EpidStatus NewFfElement (FiniteField const *ff, FfElement **new_ff_elem)
 Creates a new finite field element. More...
 
void DeleteFfElement (FfElement **ff_elem)
 Frees a previously allocated FfElement. More...
 
EpidStatus ReadFfElement (FiniteField *ff, void const *ff_elem_str, size_t strlen, FfElement *ff_elem)
 Deserializes a FfElement from a string. More...
 
EpidStatus WriteFfElement (FiniteField *ff, FfElement const *ff_elem, void *ff_elem_str, size_t strlen)
 Serializes a finite field element to a string. More...
 
EpidStatus FfNeg (FiniteField *ff, FfElement const *a, FfElement *r)
 Calculates the additive inverse of a finite field element. More...
 
EpidStatus FfInv (FiniteField *ff, FfElement const *a, FfElement *r)
 Calculates the multiplicative inverse of a finite field element. More...
 
EpidStatus FfAdd (FiniteField *ff, FfElement const *a, FfElement const *b, FfElement *r)
 Adds two finite field elements. More...
 
EpidStatus FfMul (FiniteField *ff, FfElement const *a, FfElement const *b, FfElement *r)
 Multiplies two finite field elements. More...
 
EpidStatus FfIsZero (FiniteField *ff, FfElement const *a, bool *is_zero)
 Checks if given finite field element is the additive identity (zero). More...
 
EpidStatus FfExp (FiniteField *ff, FfElement const *a, BigNum const *b, FfElement *r)
 Raises an element of a finite field to a power. More...
 
EpidStatus FfMultiExp (FiniteField *ff, FfElement const **a, BigNumStr const **b, size_t m, FfElement *r)
 Multi-exponentiates finite field elements. More...
 
EpidStatus FfSscmMultiExp (FiniteField *ff, FfElement const **a, BigNumStr const **b, size_t m, FfElement *r)
 Software side-channel mitigated implementation of FfMultiExp. More...
 
EpidStatus FfIsEqual (FiniteField *ff, FfElement const *a, FfElement const *b, bool *is_equal)
 Checks if two finite field elements are equal. More...
 
EpidStatus FfHash (FiniteField *ff, void const *msg, size_t msg_len, HashAlg hash_alg, FfElement *r)
 Hashes an arbitrary message to an element in a finite field. More...
 
EpidStatus FfGetRandom (FiniteField *ff, BigNumStr const *low_bound, BitSupplier rnd_func, void *rnd_param, FfElement *r)
 Generate random finite field element. More...
 
+

Detailed Description

+

Finite field operations.

+

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.

+

Function Documentation

+ +
+
+ + + + + + + + +
void DeleteFfElement (FfElement ** ff_elem)
+
+ +

Frees a previously allocated FfElement.

+

Frees memory pointed to by ff_elem. Nulls the pointer.

+
Parameters
+ + +
[in]ff_elemThe finite field element. Can be NULL.
+
+
+
See also
NewFfElement
+ +
+
+ +
+
+ + + + + + + + +
void DeleteFiniteField (FiniteField ** ff)
+
+ +

Frees a previously allocated FiniteField.

+

Frees memory pointed to by finite field. Nulls the pointer.

+
Parameters
+ + +
[in]ffThe Finite field. Can be NULL.
+
+
+
See also
NewFiniteField
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus FfAdd (FiniteFieldff,
FfElement const * a,
FfElement const * b,
FfElementr 
)
+
+ +

Adds two finite field elements.

+
Parameters
+ + + + + +
[in]ffThe finite field.
[out]aThe left hand parameter.
[out]bThe right hand parameter.
[out]rThe result of adding a and b.
+
+
+
Returns
EpidStatus
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus FfExp (FiniteFieldff,
FfElement const * a,
BigNum const * b,
FfElementr 
)
+
+ +

Raises an element of a finite field to a power.

+
Parameters
+ + + + + +
[in]ffThe finite field in which to perform the operation
[in]aThe base.
[in]bThe power.
[out]rThe result of raising a to the power b.
+
+
+
Returns
EpidStatus
+
See also
NewFiniteField
+
+NewFfElement
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus FfGetRandom (FiniteFieldff,
BigNumStr const * low_bound,
BitSupplier rnd_func,
void * rnd_param,
FfElementr 
)
+
+ +

Generate random finite field element.

+
Parameters
+ + + + + + +
[in]ffThe finite field associated with the random finite field element.
[in]low_boundLower bound of the random finite field to be generated.
[in]rnd_funcRandom number generator.
[in]rnd_paramPass through context data for rnd_func.
[in,out]rThe random finite field element.
+
+
+
Returns
EpidStatus
+
Return values
+ + +
kEpidRandMaxIterErrthe function should be called again with different random data.
+
+
+
See also
NewFfElement
+
+BitSupplier
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus FfHash (FiniteFieldff,
void const * msg,
size_t msg_len,
HashAlg hash_alg,
FfElementr 
)
+
+ +

Hashes an arbitrary message to an element in a finite field.

+
Parameters
+ + + + + + +
[in]ffThe finite field.
[in]msgThe message.
[in]msg_lenThe size of msg in bytes.
[in]hash_algThe hash algorithm.
[out]rThe hashed value.
+
+
+
Returns
EpidStatus
+
See also
NewFiniteField
+
+NewFfElement
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus FfInv (FiniteFieldff,
FfElement const * a,
FfElementr 
)
+
+ +

Calculates the multiplicative inverse of a finite field element.

+
Parameters
+ + + + +
[in]ffThe finite field.
[in]aThe element.
[out]rThe inverted element.
+
+
+
Returns
EpidStatus
+
See also
NewFiniteField
+
+NewFfElement
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus FfIsEqual (FiniteFieldff,
FfElement const * a,
FfElement const * b,
boolis_equal 
)
+
+ +

Checks if two finite field elements are equal.

+
Parameters
+ + + + + +
[in]ffThe finite field.
[in]aAn element to check.
[in]bAnother element to check.
[out]is_equalThe result of the check.
+
+
+
Returns
EpidStatus
+
See also
NewEcGroup
+
+NewEcPoint
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus FfIsZero (FiniteFieldff,
FfElement const * a,
boolis_zero 
)
+
+ +

Checks if given finite field element is the additive identity (zero).

+
Parameters
+ + + + +
[in]ffThe finite field.
[out]aThe element.
[out]is_zeroThe result of the check.
+
+
+
Returns
EpidStatus
+
See also
NewFiniteField
+
+NewFfElement
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus FfMul (FiniteFieldff,
FfElement const * a,
FfElement const * b,
FfElementr 
)
+
+ +

Multiplies two finite field elements.

+
Parameters
+ + + + + +
[in]ffThe finite field.
[out]aThe left hand parameter.
[out]bThe right hand parameter. If ff is an extension field of a field F then this parameter may be an element of either ff or F.
[out]rThe result of multiplying a and b.
+
+
+
Returns
EpidStatus
+
See also
NewFiniteField
+
+NewFfElement
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus FfMultiExp (FiniteFieldff,
FfElement const ** a,
BigNumStr const ** b,
size_t m,
FfElementr 
)
+
+ +

Multi-exponentiates finite field elements.

+

Calculates FfExp(p[0],b[0]) * ... * FfExp(p[m-1],b[m-1]) for m > 1

+
Parameters
+ + + + + + +
[in]ffThe finite field in which to perform the operation
[in]aThe bases.
[in]bThe powers.
[in]mNumber of entries in a and b.
[out]rThe result of raising each a to the corresponding power b and multiplying the results.
+
+
+
Returns
EpidStatus
+
See also
NewFiniteField
+
+NewFfElement
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus FfNeg (FiniteFieldff,
FfElement const * a,
FfElementr 
)
+
+ +

Calculates the additive inverse of a finite field element.

+
Parameters
+ + + + +
[in]ffThe finite field.
[in]aThe element.
[out]rThe inverted element.
+
+
+
Returns
EpidStatus
+
See also
NewFiniteField
+
+NewFfElement
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus FfSscmMultiExp (FiniteFieldff,
FfElement const ** a,
BigNumStr const ** b,
size_t m,
FfElementr 
)
+
+ +

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.
+
Parameters
+ + + + + + +
[in]ffThe finite field in which to perform the operation.
[in]aThe bases.
[in]bThe powers.
[in]mNumber of entries in a and b.
[out]rThe result of raising each a to the corresponding power b and multiplying the results.
+
+
+
Returns
EpidStatus
+
See also
NewFiniteField
+
+NewFfElement
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
EpidStatus NewFfElement (FiniteField const * ff,
FfElement ** new_ff_elem 
)
+
+ +

Creates a new finite field element.

+

Allocates memory and creates a new finite field element.

+

Use DeleteFfElement() to free memory.

+
Parameters
+ + + +
[in]ffThe finite field.
[out]new_ff_elemThe Newly constructed finite field element.
+
+
+
Returns
EpidStatus
+
See also
NewFiniteField
+
+DeleteFfElement
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
EpidStatus NewFiniteField (BigNumStr const * prime,
FiniteField ** ff 
)
+
+ +

Creates new finite field.

+

Allocates memory and creates a new finite field GF(prime).

+

Use DeleteFiniteField() to free memory.

+
Parameters
+ + + +
[in]primeThe order of finite field.
[out]ffThe Newly constructed finite field.
+
+
+
Returns
EpidStatus
+
See also
DeleteFiniteField
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus NewFiniteFieldViaBinomalExtension (FiniteField const * ground_field,
FfElement const * ground_element,
int degree,
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.

+
Parameters
+ + + + + +
[in]ground_fieldThe ground field.
[in]ground_elementThe low-order term of the extension.
[in]degreeThe degree of the extension.
[out]ffThe Newly constructed finite field.
+
+
+
Returns
EpidStatus
+
See also
DeleteFiniteField
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus ReadFfElement (FiniteFieldff,
void const * ff_elem_str,
size_t strlen,
FfElementff_elem 
)
+
+ +

Deserializes a FfElement from a string.

+
Parameters
+ + + + + +
[in]ffThe the finite field.
[in]ff_elem_strThe serialized value.
[in]strlenThe size of ff_elem_str in bytes.
[out]ff_elemthe target FfElement.
+
+
+
Returns
EpidStatus
+
See also
NewFfElement
+
+WriteFfElement
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus WriteFfElement (FiniteFieldff,
FfElement const * ff_elem,
void * ff_elem_str,
size_t strlen 
)
+
+ +

Serializes a finite field element to a string.

+
Parameters
+ + + + + +
[in]ffThe finite field.
[in]ff_elemThe FfElement to be serialized.
[out]ff_elem_strThe target string.
[in]strlenThe size of ff_elem_str in bytes.
+
+
+
Returns
EpidStatus
+
See also
NewFfElement
+
+FpElemStr
+
+FqElemStr
+
+GtElemStr
+ +
+
+
+
+ + + + + diff --git a/doc/html/group___finite_field_primitives.js b/doc/html/group___finite_field_primitives.js new file mode 100644 index 0000000..462a90c --- /dev/null +++ b/doc/html/group___finite_field_primitives.js @@ -0,0 +1,23 @@ +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#ga18a952cebb4a1274c73e6cb0c19e8aea", 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 ], + [ "FfNeg", "group___finite_field_primitives.html#gae7a8c7503b6fc7a41bcaab4d45ca37b2", null ], + [ "FfSscmMultiExp", "group___finite_field_primitives.html#ga0d0c31a22bbfb665a16b2d25b0cd2634", 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 ], + [ "ReadFfElement", "group___finite_field_primitives.html#ga884d9e1baadf29a410244a735853e3c7", null ], + [ "WriteFfElement", "group___finite_field_primitives.html#ga678694636708463b078d842d5c58a900", 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..3125c01 --- /dev/null +++ b/doc/html/group___hash_primitives.html @@ -0,0 +1,142 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: hash + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
hash
+
+
+ +

Hash primitives. +More...

+ + + + + +

+Data Structures

struct  Sha256Digest
 SHA256 digest. More...
 
+ + + + +

+Functions

EpidStatus Sha256MessageDigest (void const *msg, size_t len, Sha256Digest *digest)
 Computes SHA256 digest of a message. More...
 
+

Detailed Description

+

Hash primitives.

+

Provides APIs for computing digests of messages.

+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus Sha256MessageDigest (void const * msg,
size_t len,
Sha256Digestdigest 
)
+
+ +

Computes SHA256 digest of a message.

+
Parameters
+ + + + +
[in]msgMessage to compute digest for.
[in]lenThe size of msg in bytes.
[out]digestThe resulting message digest.
+
+
+
Returns
EpidStatus
+ +
+
+
+
+ + + + + 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..6b31f61 --- /dev/null +++ b/doc/html/group___pairing_primitives.html @@ -0,0 +1,249 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: pairing + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
pairing
+
+
+ +

Pairing operations. +More...

+ + + + + +

+Typedefs

+typedef struct PairingState PairingState
 A pairing.
 
+ + + + + + + + + + +

+Functions

EpidStatus NewPairingState (EcGroup const *ga, EcGroup const *gb, FiniteField *ff, BigNumStr const *t, bool neg, PairingState **ps)
 Constructs a new Pairing State. More...
 
void DeletePairingState (PairingState **ps)
 Frees a previously allocated by PairingState. More...
 
EpidStatus Pairing (PairingState *ps, FfElement *d, EcPoint const *a, EcPoint const *b)
 Computes an Optimal Ate Pairing for two parameters. More...
 
+

Detailed Description

+

Pairing operations.

+

Provides APIs for defining and using a pairing relationship between two Elliptic Curve Groups.

+

Function Documentation

+ +
+
+ + + + + + + + +
void DeletePairingState (PairingState ** ps)
+
+ +

Frees a previously allocated by PairingState.

+

Frees memory pointed to by pairing state. Nulls the pointer.

+
Parameters
+ + +
[in]psThe Pairing state. Can be NULL.
+
+
+
See also
NewPairingState
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus NewPairingState (EcGroup const * ga,
EcGroup const * gb,
FiniteFieldff,
BigNumStr const * t,
bool neg,
PairingState ** ps 
)
+
+ +

Constructs a new Pairing State.

+

Allocates memory and creates a new Pairing State for Optimal Ate Pairing.

+

Use DeletePairingState() to free memory.

+
Parameters
+ + + + + + + +
[in]gaThe EcGroup from which the first parameter of the pairing is taken.
[in]gbThe EcGroup from which the second parameter of the pairing is taken.
[in]ffThe result finite field. Must be a Fq12 field.
[in]tA positive integer such that 6(t^2) == q - p, where p and q are parameters of G1.
[in]negSelect the alternate "negate" processing path for Optimal Ate Pairing.
[out]psNewly constructed Pairing State.
+
+
+
Returns
EpidStatus
+
See also
DeletePairingState
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EpidStatus Pairing (PairingStateps,
FfElementd,
EcPoint const * a,
EcPoint const * b 
)
+
+ +

Computes an Optimal Ate Pairing for two parameters.

+
Parameters
+ + + + + +
[in]psThe pairing state.
[out]dThe result of the pairing. Will be in ff used to create the pairing state.
[in]aThe first value to pair. Must be in ga used to create ps.
[in]bThe second value to pair. Must be in gb used to create ps
+
+
+
Returns
EpidStatus
+ +
+
+
+
+ + + + + diff --git a/doc/html/group___pairing_primitives.js b/doc/html/group___pairing_primitives.js new file mode 100644 index 0000000..4f76120 --- /dev/null +++ b/doc/html/group___pairing_primitives.js @@ -0,0 +1,7 @@ +var group___pairing_primitives = +[ + [ "PairingState", "group___pairing_primitives.html#ga3f1fa61d25487f96dfb0ffef4ad35607", null ], + [ "DeletePairingState", "group___pairing_primitives.html#gad54aebdc331d39b73000fdca9e04f94d", null ], + [ "NewPairingState", "group___pairing_primitives.html#ga29f79a645871830754d396b9b4a2a0cc", null ], + [ "Pairing", "group___pairing_primitives.html#ga5dd07d13536e27c37eaeee285297066c", null ] +]; \ No newline at end of file diff --git a/doc/html/grouppubkey_8c.html b/doc/html/grouppubkey_8c.html new file mode 100644 index 0000000..009cf42 --- /dev/null +++ b/doc/html/grouppubkey_8c.html @@ -0,0 +1,96 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/grouppubkey.c File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
grouppubkey.c File Reference
+
+
+ +

Group public key implementation. +More...

+ + + + + + + + +

+Functions

EpidStatus CreateGroupPubKey (GroupPubKey const *pub_key_str, EcGroup *G1, EcGroup *G2, GroupPubKey_ **pub_key)
 Constructs internal representation of GroupPubKey. More...
 
void DeleteGroupPubKey (GroupPubKey_ **pub_key)
 Deallocates storage for internal representation of GroupPubKey. More...
 
+

Detailed Description

+

Group public key implementation.

+
+
+ + + + + diff --git a/doc/html/grouppubkey_8h.html b/doc/html/grouppubkey_8h.html new file mode 100644 index 0000000..a179e82 --- /dev/null +++ b/doc/html/grouppubkey_8h.html @@ -0,0 +1,104 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/grouppubkey.h File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
grouppubkey.h File Reference
+
+
+ +

Group public key interface. +More...

+ + + + + +

+Data Structures

struct  GroupPubKey_
 Internal representation of GroupPubKey. More...
 
+ + + + + + + +

+Functions

EpidStatus CreateGroupPubKey (GroupPubKey const *pub_key_str, EcGroup *G1, EcGroup *G2, GroupPubKey_ **pub_key)
 Constructs internal representation of GroupPubKey. More...
 
void DeleteGroupPubKey (GroupPubKey_ **pub_key)
 Deallocates storage for internal representation of GroupPubKey. More...
 
+

Detailed Description

+

Group public key interface.

+
+
+ + + + + diff --git a/doc/html/hash_8h.html b/doc/html/hash_8h.html new file mode 100644 index 0000000..fb3b6f6 --- /dev/null +++ b/doc/html/hash_8h.html @@ -0,0 +1,102 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: epid/common/math/hash.h File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
hash.h File Reference
+
+
+ +

Hash primitives. +More...

+
#include <stddef.h>
+#include <stdint.h>
+#include <limits.h>
+#include "epid/common/errors.h"
+
+ + + + +

+Data Structures

struct  Sha256Digest
 SHA256 digest. More...
 
+ + + + +

+Functions

EpidStatus Sha256MessageDigest (void const *msg, size_t len, Sha256Digest *digest)
 Computes SHA256 digest of a message. More...
 
+

Detailed Description

+

Hash primitives.

+
+
+ + + + + diff --git a/doc/html/implementation__notes_8dox.html b/doc/html/implementation__notes_8dox.html new file mode 100644 index 0000000..be407ab --- /dev/null +++ b/doc/html/implementation__notes_8dox.html @@ -0,0 +1,82 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: doc/docsrc/implementation_notes.dox File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
doc/docsrc/implementation_notes.dox File Reference
+
+
+ +

This file is used by Doxygen to generate documentation. +More...

+

Detailed Description

+

This file is used by Doxygen to generate documentation.

+
+
+ + + + + diff --git a/doc/html/index.html b/doc/html/index.html new file mode 100644 index 0000000..3a81885 --- /dev/null +++ b/doc/html/index.html @@ -0,0 +1,78 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: Introducing the Intel® EPID SDK + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
Introducing the Intel® EPID SDK
+
+
+

Intel® EPID is a cryptographic protocol which enables the remote authentication of a trusted platform whilst preserving the user's privacy.

+

The Intel® EPID Software Development Kit provides an implementation of the Intel® EPID specification that developers can use when developing their own applications using Intel® EPID technology.

+
+
+ + + + + diff --git a/doc/html/issuer__material_8dox.html b/doc/html/issuer__material_8dox.html new file mode 100644 index 0000000..b8c9918 --- /dev/null +++ b/doc/html/issuer__material_8dox.html @@ -0,0 +1,82 @@ + + + + + + + +Intel® Enhanced Privacy ID SDK: doc/docsrc/issuer_material.dox File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+
doc/docsrc/issuer_material.dox File Reference
+
+
+ +

This file is used by Doxygen to generate documentation. +More...

+

Detailed Description

+

This file is used by Doxygen to generate documentation.

+
+
+ + + + + diff --git a/doc/html/jquery.js b/doc/html/jquery.js new file mode 100644 index 0000000..1f4d0b4 --- /dev/null +++ b/doc/html/jquery.js @@ -0,0 +1,68 @@ +/*! + * 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(;b40){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(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?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
a";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>",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="
";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="
t
";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="
";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-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=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=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=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;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?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;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=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 bRe[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=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.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="";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="

";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="
";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;bT0){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;bT0){for(bB=bA;bB=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-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=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_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
","
"]}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>");try{for(var bw=0,bv=this.length;bw1&&bw0?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>");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]===""&&!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=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)<[^<]*)*<\/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=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("
").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.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").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"?"":"")+"");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;h0){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('
').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
');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(hl.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');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=$('