Welcome to MP-SPDZ’s documentation!
MP-SPDZ is a framework for multi-party computation, a privacy-enhancing technology focused on input privacy. It uses protocols running between several entities to create a conceptual black box in which data can operated on privately. Such a black box could be created between banks or healthcare providers to jointly operate on privacy-sensitive data. Please see this gentle introduction for more information on multi-party computation.
If you’re new to MP-SPDZ, consider the following:
Input/Output lists all the ways of getting data in and out.
Contents:
- Getting Started
- Running Computation
- Compiling high-level programs
- TensorFlow inference
- Emulation
- Dishonest majority
- Honest majority
- Dealer model
- BMR
- Online-only benchmarking
- Preprocessing as required
- Benchmarking offline phases
- Recommended Reading
- Compilation Process
- Run-Time Options
- High-Level Interface
- Compiler.types module
- Basic types
- Container types
ArrayArray.assign()Array.assign_all()Array.assign_part_vector()Array.assign_vector()Array.binary_output()Array.concat()Array.create_from()Array.dot()Array.expand_to_vector()Array.get()Array.get_part()Array.get_part_vector()Array.get_reverse_vector()Array.get_vector()Array.input_from()Array.maybe_get()Array.maybe_set()Array.permute()Array.print_reveal_nested()Array.randomize()Array.read_from_file()Array.read_from_socket()Array.reveal()Array.reveal_list()Array.reveal_nested()Array.reveal_to()Array.reveal_to_binary_output()Array.reveal_to_clients()Array.reveal_to_socket_by_party()Array.same_shape()Array.secure_permute()Array.secure_shuffle()Array.shuffle()Array.sort()Array.sum()Array.to_column_matrix()Array.to_row_matrix()Array.write_to_file()Array.write_to_socket()
MatrixMatrix.assign()Matrix.assign_all()Matrix.assign_part_vector()Matrix.assign_vector()Matrix.assign_vector_by_indices()Matrix.concat()Matrix.concat_columns()Matrix.diag()Matrix.direct_mul()Matrix.direct_mul_trans()Matrix.direct_trans_mul()Matrix.dot()Matrix.get_column()Matrix.get_part()Matrix.get_part_vector()Matrix.get_slice_vector()Matrix.get_vector()Matrix.get_vector_by_indices()Matrix.iadd()Matrix.input_from()Matrix.mul_trans()Matrix.mul_trans_to()Matrix.permute()Matrix.print_reveal_nested()Matrix.randomize()Matrix.read_from_file()Matrix.read_from_socket()Matrix.reveal()Matrix.reveal_list()Matrix.reveal_nested()Matrix.reveal_to_binary_output()Matrix.reveal_to_clients()Matrix.reveal_to_socket_by_party()Matrix.same_shape()Matrix.schur()Matrix.secure_permute()Matrix.secure_shuffle()Matrix.set_column()Matrix.sort()Matrix.trace()Matrix.trans_mul()Matrix.trans_mul_to()Matrix.transpose()Matrix.write_to_file()Matrix.write_to_socket()
MemValueMultiArrayMultiArray.assign()MultiArray.assign_all()MultiArray.assign_part_vector()MultiArray.assign_vector()MultiArray.assign_vector_by_indices()MultiArray.concat()MultiArray.diag()MultiArray.direct_mul()MultiArray.direct_mul_trans()MultiArray.direct_trans_mul()MultiArray.dot()MultiArray.get_column()MultiArray.get_part()MultiArray.get_part_vector()MultiArray.get_slice_vector()MultiArray.get_vector()MultiArray.get_vector_by_indices()MultiArray.iadd()MultiArray.input_from()MultiArray.mul_trans()MultiArray.mul_trans_to()MultiArray.permute()MultiArray.print_reveal_nested()MultiArray.randomize()MultiArray.read_from_file()MultiArray.read_from_socket()MultiArray.reveal()MultiArray.reveal_list()MultiArray.reveal_nested()MultiArray.reveal_to_binary_output()MultiArray.reveal_to_clients()MultiArray.reveal_to_socket_by_party()MultiArray.same_shape()MultiArray.schur()MultiArray.secure_permute()MultiArray.secure_shuffle()MultiArray.set_column()MultiArray.sort()MultiArray.trace()MultiArray.trans_mul()MultiArray.trans_mul_to()MultiArray.transpose()MultiArray.write_to_file()MultiArray.write_to_socket()
cfixcfloatcgf2ncgf2n.Array()cgf2n.Matrix()cgf2n.MemValue()cgf2n.Tensor()cgf2n.binary_output()cgf2n.bit_and()cgf2n.bit_compose()cgf2n.bit_decompose()cgf2n.bit_not()cgf2n.bit_or()cgf2n.bit_xor()cgf2n.cond_swap()cgf2n.field_div()cgf2n.half_adder()cgf2n.iadd()cgf2n.if_else()cgf2n.load_mem()cgf2n.malloc()cgf2n.max()cgf2n.min()cgf2n.print_reg_plain()cgf2n.read_from_file()cgf2n.reveal()cgf2n.square()cgf2n.store_in_mem()cgf2n.update()cgf2n.write_to_file()cgf2n.write_to_socket()
cintcint.Array()cint.Matrix()cint.MemValue()cint.Tensor()cint.binary_output()cint.bit_adder()cint.bit_and()cint.bit_compose()cint.bit_decompose()cint.bit_not()cint.bit_or()cint.bit_xor()cint.cond_swap()cint.digest()cint.field_div()cint.half_adder()cint.iadd()cint.if_else()cint.legendre()cint.less_than()cint.load_mem()cint.malloc()cint.max()cint.min()cint.mod2m()cint.print_if()cint.print_reg_plain()cint.read_from_file()cint.read_from_socket()cint.reveal()cint.right_shift()cint.square()cint.store_in_mem()cint.to_regint()cint.update()cint.write_to_file()cint.write_to_socket()
localintpersonalregintregint.Array()regint.Matrix()regint.MemValue()regint.Tensor()regint.binary_output()regint.bit_adder()regint.bit_and()regint.bit_compose()regint.bit_decompose()regint.bit_not()regint.bit_or()regint.bit_xor()regint.cond_swap()regint.get_random()regint.half_adder()regint.iadd()regint.if_else()regint.inc()regint.load_mem()regint.malloc()regint.max()regint.min()regint.mod2m()regint.pop()regint.print_if()regint.print_reg_plain()regint.push()regint.read_from_file()regint.read_from_socket()regint.reveal()regint.shuffle()regint.square()regint.store_in_mem()regint.update()regint.write_to_file()regint.write_to_socket()
sfixsfix.Array()sfix.Matrix()sfix.MemValue()sfix.Tensor()sfix.bit_decompose()sfix.compute_reciprocal()sfix.dot()sfix.dot_product()sfix.equal()sfix.get_input_from()sfix.get_random()sfix.greater_equal()sfix.greater_than()sfix.iadd()sfix.input_tensor_from()sfix.input_tensor_from_client()sfix.input_tensor_via()sfix.less_equal()sfix.less_than()sfix.load_mem()sfix.max()sfix.min()sfix.not_equal()sfix.read_from_file()sfix.receive_from_client()sfix.rep_typesfix.reveal()sfix.reveal_to()sfix.reveal_to_clients()sfix.round_nearestsfix.set_precision()sfix.square()sfix.store_in_mem()sfix.update()sfix.write_shares_to_socket()sfix.write_to_file()
sfloatsfloat.Array()sfloat.Matrix()sfloat.MemValue()sfloat.Tensor()sfloat.get_input_from()sfloat.iadd()sfloat.input_tensor_from()sfloat.input_tensor_from_client()sfloat.input_tensor_via()sfloat.load_mem()sfloat.max()sfloat.min()sfloat.reveal()sfloat.round_to_int()sfloat.square()sfloat.store_in_mem()sfloat.update()
sgf2nsgf2n.Array()sgf2n.Matrix()sgf2n.MemValue()sgf2n.Tensor()sgf2n.bit_and()sgf2n.bit_compose()sgf2n.bit_decompose()sgf2n.bit_not()sgf2n.bit_or()sgf2n.bit_xor()sgf2n.cond_swap()sgf2n.dot_product()sgf2n.equal()sgf2n.field_div()sgf2n.get_input_from()sgf2n.get_random_bit()sgf2n.get_random_input_mask_for()sgf2n.get_random_inverse()sgf2n.get_random_square()sgf2n.get_random_triple()sgf2n.half_adder()sgf2n.iadd()sgf2n.if_else()sgf2n.input_tensor_from()sgf2n.input_tensor_from_client()sgf2n.input_tensor_via()sgf2n.load_mem()sgf2n.malloc()sgf2n.max()sgf2n.min()sgf2n.not_equal()sgf2n.raw_right_shift()sgf2n.read_from_file()sgf2n.reveal()sgf2n.reveal_to()sgf2n.right_shift()sgf2n.square()sgf2n.store_in_mem()sgf2n.update()sgf2n.write_to_file()
sintsint.Array()sint.Matrix()sint.MemValue()sint.Tensor()sint.bit_adder()sint.bit_and()sint.bit_compose()sint.bit_decompose()sint.bit_not()sint.bit_or()sint.bit_xor()sint.cond_swap()sint.dot_product()sint.equal()sint.field_div()sint.get_dabit()sint.get_edabit()sint.get_input_from()sint.get_random()sint.get_random_bit()sint.get_random_input_mask_for()sint.get_random_int()sint.get_random_inverse()sint.get_random_square()sint.get_random_triple()sint.greater_equal()sint.greater_than()sint.half_adder()sint.iadd()sint.if_else()sint.input_tensor_from()sint.input_tensor_from_client()sint.input_tensor_via()sint.int_div()sint.int_mod()sint.left_shift()sint.less_equal()sint.less_than()sint.load_mem()sint.malloc()sint.max()sint.min()sint.mod2m()sint.not_equal()sint.pow2()sint.prefix_sum()sint.private_division()sint.raw_right_shift()sint.read_from_file()sint.read_from_socket()sint.receive_from_client()sint.reveal()sint.reveal_to()sint.reveal_to_clients()sint.right_shift()sint.round()sint.square()sint.store_in_mem()sint.update()sint.write_fully_to_socket()sint.write_shares_to_socket()sint.write_to_file()sint.write_to_socket()
sintbit
- Compiler.GC.types module
cbitssbitsbitfixvecsbitfixvec.Array()sbitfixvec.MemValue()sbitfixvec.add()sbitfixvec.bit_decompose()sbitfixvec.compute_reciprocal()sbitfixvec.equal()sbitfixvec.get_input_from()sbitfixvec.get_random()sbitfixvec.greater_equal()sbitfixvec.greater_than()sbitfixvec.iadd()sbitfixvec.less_equal()sbitfixvec.less_than()sbitfixvec.max()sbitfixvec.min()sbitfixvec.not_equal()sbitfixvec.reveal()sbitfixvec.round_nearestsbitfixvec.set_precision()sbitfixvec.square()sbitfixvec.store_in_mem()sbitfixvec.update()
sbitintvecsbitintvec.bit_and()sbitintvec.bit_not()sbitintvec.bit_or()sbitintvec.bit_xor()sbitintvec.equal()sbitintvec.from_hex()sbitintvec.get_type()sbitintvec.half_adder()sbitintvec.iadd()sbitintvec.max()sbitintvec.min()sbitintvec.popcnt()sbitintvec.pow2()sbitintvec.reveal_print_hex()sbitintvec.square()
sbitssbitvec
- Compiler.library module
accept_client_connection()break_loop()break_point()check_point()crash()do_while()for_range()for_range_multithread()for_range_opt()for_range_opt_multithread()for_range_parallel()foreach_enumerate()function()get_arg()get_cmdline_arg()get_number_of_players()get_player_id()get_thread_number()get_threshold()if_()if_e()init_client_connection()listen_for_clients()map_sum_opt()map_sum_simple()multithread()print_both()print_float_precision()print_ln()print_ln_if()print_ln_to()print_str()print_str_if()public_input()runtime_error()runtime_error_if()start_timer()stop_timer()tree_reduce()tree_reduce_multithread()while_do()
- Compiler.mpc_math module
- Compiler.ml module
AdamAddArgmaxBatchNormConcatDenseDropoutFixAveragePool2dFixConv2dFusedBatchNormGeluLayerNormMaxPoolMultiOutputOptimizerOutputReluReluMultiOutputSGDSGDLinearSGDLogisticSquareTwoQuadOutputargmax()cholesky()easyConv2d()easyMaxPool()layers_from_torch()mr()relu()relu_prime()sigmoid()sigmoid_prime()softmax()solve_cholesky()solve_linear()solve_lower()solve_upper()var()approx_sigmoid()
- Compiler.decision_tree module
- Compiler.circuit module
- Compiler.program module
ProgramProgram.activeProgram.join_tapes()Program.new_tape()Program.options_from_args()Program.protect_memory()Program.public_input()Program.run_tapes()Program.securityProgram.set_bit_length()Program.use_dabitProgram.use_edabit()Program.use_invperm()Program.use_split()Program.use_square()Program.use_trunc_pr
- Compiler.oram module
- Compiler.sqrt_oram module
- Compiler.path_oblivious_heap module
- Compiler.dijkstra module
- Compiler.sorting module
- Compiler.types module
- Bytecode Utilities
- The Journey of a Program
- Compiler Optimizations
- Virtual Machine
- Schedule File
- Bytecode
- Instructions
- Compiler.instructions module
acceptclientconnectionactiveaddcaddciaddintaddmaddsaddsiandcandciapplyshuffleasm_openbitbitdecintcall_argcall_tapecheckcisccloseclientconnectioncmdlineargconcatscond_print_plaincond_print_strconv2dsconvintconvmodpcrashdabitdelshuffledigestcdivcdivcidivintdotprodsedabiteqceqzcfile_basefixinputfloatoutputfloordivcgensecshufflegtcincintinitclientconnectioninputfixinputfloatinputmaskinputmaskreginputmixedinputmixedreginputpersonalintoutputinv2minverseinverse_permutationjmpjmpeqzjmpijmpnzjoin_tapeldargldildintldmcldmcildmintldmintildmsldmsildsildtnlegendreclistenltcltzcmatmulsmatmulsmmodcmodcimovcmovintmovsmul_basemulcmulcimulintmulmmulrsmulsmulsinotcnplayersorcorcipersonal_basepicksplayeridpopintprefixsumsprepprint_charprint_char4print_float_plainprint_float_precprint_intprint_regprint_reg_plainprint_reg_plainsprivateoutputpubinputpushintrandrandomfullsrandomsrawinputreadfileclearreadsharesfromfilereadsocketcreadsocketintreadsocketsreqblrun_tapesecshufflesedabitsendpersonalshlcshlcishrcshrcishrsishuffleshuffle_basesquarestargstartstmcstmcistmintstmintistmsstmsistopsubcsubcfisubcisubintsubmlsubmrsubssubsfisubsithresholdtimetripletrunc_prunsplituseuse_edabituse_inpuse_matmuluse_prepwritefileclearwritesharestofilewritesocketswritesocketsharexorcxorcizips
- Compiler.GC.instructions module
BinaryCiscableaddcbaddcbiandmandrsandrsvecandsbitbbitcomsbitdeccbitdecscond_print_strbconvcbitconvcbit2sconvcbitvecconvcintconvcintvecconvsintinputbinputbvecldbitsldmcbldmcbildmsbldmsbimovsbmulcbinotcbnotsprint_float_plainbprint_reg_plainbprint_reg_plainsbprint_reg_signedprint_regbrevealshlcbishrcbisplitstmcbstmcbistmsbstmsbitransxorcbxorcbixormxors
- Low-Level Interface
- Using High-Level Functionality in C++
- Navigating the C++ Code
- Machine Learning Quickstart
- Machine Learning
- Networking
- Input/Output
- Client Interface
- Multinode Computation Example
- Non-linear Computation
- Preprocessing
- Lowest-Level Interface
- Adding a Protocol
- Adding an Instruction
- Homomorphic Encryption
- Threshold ECDSA
- Security Fixes
- Malicious parties are not committed to MAC key across threads and executions
- Insufficient checks in Rep4
- Co-ordinate MAC checks among threads and race condition in MAC checks
- Remove MAC key in case of failure
- Remotely caused buffer overflows
- Missing shuffling check in PS mod 2^k and Brain
- Insufficient drowning in pairwise protocols
- Proper accounting for random elements
- Insufficient security in non-interactive zero-knowledge proofs
- Security bug in SPDZ2k
- Skewed random bit generation
- All-zero secret keys in homomorphic encryption
- Insufficient randomness in SemiBin random bit generation
- Missing MAC key initialization
- Troubleshooting
- Crash without error message,
Killed, orbad_alloc - List indices must be integers or slices
- Local variable referenced before assignment
compile.pytakes too long or runs out of memory- Cannot derive truth value from register
- Cannot branch on secret values
- Incorrect results when using
sfix - Variable results when using
sfix - Only party 0 produces outputs
- Order of memory instructions not preserved
- High number of rounds or slow WAN execution
- Odd timings
- Disparities in round figures
- Handshake failures
- Connection failures
- Internally called tape has unknown offline data usage
- Illegal instruction
- Invalid instruction
- Computation used more preprocessing than expected
- Required prime bit length is not the same as
-Fparameter during compilation - Prime number not compatible with encryption scheme
- Windows/VirtualBox performance
mac_fail- Debugging errors in a virtual machine
- Crash without error message,