Mzn xor linear model¶
- class MznXorLinearModel(cipher)¶
Bases:
MznModel- add_comment(comment)¶
Write a ‘comment’ at the beginning of the model.
INPUT:
comment– string; string with the comment to be added
- add_constraint_from_str(str_constraint)¶
- add_output_comment(comment)¶
- add_solution_to_components_values(component_id, component_solution, components_values, j, output_to_parse, solution_number, string)¶
- add_solution_to_components_values_internal(component_solution, components_values, component_weight, solution_number, component)¶
- add_solutions_from_components_values(components_values, memory, model_type, solutions, solve_time, solver_name, solver_output, total_weight, solve_external)¶
- and_xor_linear_probability_lat(numadd)¶
Return the lat of the and operation.
INPUT:
numadd– integer; the number of addenda
EXAMPLES:
sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: from claasp.ciphers.block_ciphers.simon_block_cipher import SimonBlockCipher sage: simon = SimonBlockCipher() sage: cp = MznXorLinearModel(simon) sage: cp.and_xor_linear_probability_lat(2) [2, 1, 0, 1, 0, 1, 0, -1]
- branch_xor_linear_constraints()¶
Return a list of Cp constraints for the branching of the linear model.
INPUT:
None
EXAMPLES:
sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: speck = SpeckBlockCipher(block_bit_size=32, key_bit_size=64, number_of_rounds=4) sage: cp = MznXorLinearModel(speck) sage: cp.branch_xor_linear_constraints() ['constraint plaintext_o[0] = rot_0_0_i[0];', 'constraint plaintext_o[1] = rot_0_0_i[1];', 'constraint plaintext_o[2] = rot_0_0_i[2];', ... 'constraint xor_3_10_o[13] = cipher_output_3_12_i[29];', 'constraint xor_3_10_o[14] = cipher_output_3_12_i[30];', 'constraint xor_3_10_o[15] = cipher_output_3_12_i[31];']
- build_mix_column_truncated_table(component)¶
Return a model that generates the list of possible input/output couples for the given mix column.
INPUT:
component– Component object; the mix column component in Cipher
EXAMPLES:
sage: from claasp.cipher_modules.models.cp.mzn_model import MznModel sage: from claasp.ciphers.block_ciphers.aes_block_cipher import AESBlockCipher sage: aes = AESBlockCipher(number_of_rounds=3) sage: cp = MznModel(aes) sage: mix_column = aes.component_from(0, 21) sage: cp.build_mix_column_truncated_table(mix_column) 'array[0..93, 1..8] of int: mix_column_truncated_table_mix_column_0_21 = array2d(0..93, 1..8, [0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,0,1,1,1,1,0,0,1,1,0,1,1,1,0,0,1,1,1,0,1,1,0,0,1,1,1,1,0,1,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,1,0,0,1,1,1,1,0,1,0,1,0,1,1,1,0,1,0,1,1,0,1,1,0,1,0,1,1,1,0,1,0,1,0,1,1,1,1,0,0,1,0,1,1,1,1,1,0,1,1,0,0,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,1,0,0,1,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,1,1,0,1,0,1,0,1,1,1,0,1,1,0,0,1,1,1,0,1,1,1,0,1,1,1,1,0,0,1,0,1,1,1,1,0,1,0,0,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,1,0,1,1,1,1,0,0,1,1,0,1,1,1,0,0,1,1,1,0,1,1,0,0,1,1,1,1,0,1,0,0,1,1,1,1,1,1,0,1,0,0,1,1,1,1,0,1,0,1,0,1,1,1,0,1,0,1,1,0,1,1,0,1,0,1,1,1,0,1,0,1,0,1,1,1,1,1,0,1,1,0,0,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,1,1,0,1,0,1,0,1,1,1,0,1,1,1,0,1,1,1,1,0,0,1,0,1,1,1,1,0,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,1,0,1,1,1,1,0,0,1,1,0,1,1,1,0,0,1,1,1,0,1,1,0,0,1,1,1,1,1,1,0,1,0,0,1,1,1,1,0,1,0,1,0,1,1,1,0,1,0,1,1,0,1,1,0,1,0,1,1,1,1,1,0,1,1,0,0,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,1,0,1,1,1,1,0,0,1,1,0,1,1,1,0,0,1,1,1,1,1,1,0,1,0,0,1,1,1,1,0,1,0,1,0,1,1,1,0,1,0,1,1,1,1,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,1,0,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,0,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1]);'
- build_xor_linear_trail_model(weight=- 1, fixed_variables=[])¶
Build the Cp model for the search of XOR linear trails.
INPUT:
weight– integer (default: 1); a specific weight. If set to non-negative integer, fixes the XOR trail weightfixed_variables– list (default: []); dictionaries containing the variables to be fixed in standard format
EXAMPLES:
sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: from claasp.cipher_modules.models.utils import set_fixed_variables, integer_to_bit_list sage: speck = SpeckBlockCipher(block_bit_size=32, key_bit_size=64, number_of_rounds=4) sage: speck = speck.remove_key_schedule() sage: cp = MznXorLinearModel(speck) sage: fixed_variables = [set_fixed_variables('plaintext', 'not_equal', list(range(32)), integer_to_bit_list(0, 32, 'little'))] sage: cp.build_xor_linear_trail_model(-1, fixed_variables)
- calculate_bit_positions(bit_positions, input_length)¶
- calculate_bit_values(bit_values, input_length)¶
- calculate_input_bit_positions(word_index, input_name_1, input_name_2, new_input_bit_positions_1, new_input_bit_positions_2)¶
- property cipher¶
- property cipher_id¶
- final_xor_linear_constraints(weight)¶
Return a list of Cp constraints for the outputs of the cipher and solving indications for single step or second step model for xor linear model.
INPUT:
weight– integer; a specific weight. If set to non-negative integer, fixes the XOR trail weight
EXAMPLES:
sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: from claasp.cipher_modules.models.utils import set_fixed_variables, integer_to_bit_list sage: speck = SpeckBlockCipher(block_bit_size=32, key_bit_size=64, number_of_rounds=4) sage: speck = speck.remove_key_schedule() sage: cp = MznXorLinearModel(speck) sage: fixed_variables = [set_fixed_variables('plaintext', 'not_equal', list(range(32)), integer_to_bit_list(0, 32, 'little'))] sage: cp.build_xor_linear_trail_model(-1, fixed_variables) sage: cp.final_xor_linear_constraints(-1)[:-1] ['solve:: int_search(p, smallest, indomain_min, complete) minimize sum(p);']
- find_all_xor_linear_trails_with_fixed_weight(fixed_weight, fixed_values=[], solver_name='chuffed', num_of_processors=None, timelimit=None, solve_with_API=False, solve_external=False)¶
Return a list of solutions containing all the linear trails having the
fixed_weightweight of correlation. By default, the search removes the key schedule, if any.INPUT:
fixed_weight– integer; the weight to be fixedfixed_values– list (default: []); can be created usingset_fixed_variablesmethodsolver_name– string (default: Chuffed); the name of the solver. Available values are:'Chuffed''Gecode''COIN-BC'
EXAMPLES:
sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: speck = SpeckBlockCipher(block_bit_size=8, key_bit_size=16, number_of_rounds=3) sage: cp = MznXorLinearModel(speck) sage: trails = cp.find_all_xor_linear_trails_with_fixed_weight(1) # long sage: len(trails) 12 # including the key schedule in the model sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: from claasp.cipher_modules.models.utils import set_fixed_variables sage: speck = SpeckBlockCipher(block_bit_size=8, key_bit_size=16, number_of_rounds=4) sage: cp = MznXorLinearModel(speck) sage: key = set_fixed_variables('key', 'not_equal', list(range(16)), [0] * 16) sage: trails = cp.find_all_xor_linear_trails_with_fixed_weight(2, fixed_values=[key]) sage: len(trails) 8
- find_all_xor_linear_trails_with_weight_at_most(min_weight, max_weight=64, fixed_values=[], solver_name='chuffed', num_of_processors=None, timelimit=None, solve_with_API=False, solve_external=False)¶
Return a list of solutions containing all the linear trails having the weight of correlation lying in the interval
[min_weight, max_weight]. By default, the search removes the key schedule, if any.INPUT:
min_weight– integer; the weight from which to start the searchmax_weight– integer (default: 64); the weight at which the search stopsfixed_values– list (default: []); can be created usingset_fixed_variablesmethodsolver_name– string (default: Chuffed); the name of the solver. Available values are:'Chuffed''Gecode''COIN-BC'
EXAMPLES:
sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: speck = SpeckBlockCipher(block_bit_size=8, key_bit_size=16, number_of_rounds=3) sage: cp = MznXorLinearModel(speck) sage: trails = cp.find_all_xor_linear_trails_with_weight_at_most(0, 1) sage: len(trails) 13 # including the key schedule in the model sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: speck = SpeckBlockCipher(block_bit_size=8, key_bit_size=16, number_of_rounds=4) sage: cp = MznXorLinearModel(speck) sage: from claasp.cipher_modules.models.utils import set_fixed_variables sage: key = set_fixed_variables('key', 'not_equal', list(range(16)), [0] * 16) sage: trails = cp.find_all_xor_linear_trails_with_weight_at_most(0, 3, fixed_values=[key]) sage: len(trails) 73
- find_lowest_weight_xor_linear_trail(fixed_values=[], solver_name='chuffed', num_of_processors=None, timelimit=None, solve_with_API=False, solve_external=False)¶
Return the solution representing a linear trail with the lowest weight of correlation. By default, the search removes the key schedule, if any.
Note
There could be more than one trail with the lowest weight. In order to find all the lowest weight trail, run
find_all_xor_linear_trails_with_fixed_weight().INPUT:
fixed_values– list (default: []); they can be created usingset_fixed_variablesmethodsolver_name– string (default: Chuffed); the name of the solver. Available values are:'Chuffed''Gecode''COIN-BC'
EXAMPLES:
sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: speck = SpeckBlockCipher(number_of_rounds=4) sage: cp= MznXorLinearModel(speck) sage: trail = cp.find_lowest_weight_xor_linear_trail() sage: trail['total_weight'] '3.0' # including the key schedule in the model sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: from claasp.cipher_modules.models.utils import set_fixed_variables sage: speck = SpeckBlockCipher(block_bit_size=16, key_bit_size=32, number_of_rounds=4) sage: cp = MznXorLinearModel(speck) sage: key = set_fixed_variables('key', 'not_equal', list(range(32)), [0] * 32) sage: trail = cp.find_lowest_weight_xor_linear_trail(fixed_values=[key]) sage: trail['total_weight'] '3.0'
- find_one_xor_linear_trail(fixed_values=[], solver_name='chuffed', num_of_processors=None, timelimit=None, solve_with_API=False, solve_external=False)¶
Return the solution representing a linear trail with any weight of correlation. By default, the search removes the key schedule, if any.
INPUT:
fixed_values– list (default: []); can be created usingset_fixed_variablesmethodsolver_name– string (default: Chuffed); the name of the solver. Available values are:'Chuffed''Gecode''COIN-BC'
EXAMPLES:
sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: speck = SpeckBlockCipher(block_bit_size=32, key_bit_size=64, number_of_rounds=4) sage: cp = MznXorLinearModel(speck) sage: cp.find_one_xor_linear_trail() # random # including the key schedule in the model sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: speck = SpeckBlockCipher(block_bit_size=32, key_bit_size=64, number_of_rounds=4) sage: cp = MznXorLinearModel(speck) sage: from claasp.cipher_modules.models.utils import set_fixed_variables sage: key = set_fixed_variables('key', 'not_equal', list(range(64)), [0] * 64) sage: cp.find_one_xor_linear_trail(fixed_values=[key]) # random
- find_one_xor_linear_trail_with_fixed_weight(fixed_weight=- 1, fixed_values=[], solver_name='chuffed', num_of_processors=None, timelimit=None, solve_with_API=False, solve_external=False)¶
Return the solution representing a linear trail with the weight of correlation equal to
fixed_weight. By default, the search removes the key schedule, if any.INPUT:
fixed_weight– integer; the value to which the weight is fixed, if non-negativefixed_values– list (default: []); can be created usingset_fixed_variablesmethodsolver_name– string (default: Chuffed); the name of the solver. Available values are:'Chuffed''Gecode''COIN-BC'
EXAMPLES:
sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: speck = SpeckBlockCipher(block_bit_size=32, key_bit_size=64, number_of_rounds=4) sage: cp = MznXorLinearModel(speck) sage: trail = cp.find_one_xor_linear_trail_with_fixed_weight(3) sage: trail['total_weight'] '3.0' # including the key schedule in the model sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: speck = SpeckBlockCipher(block_bit_size=8, key_bit_size=16, number_of_rounds=4) sage: cp = MznXorLinearModel(speck) sage: from claasp.cipher_modules.models.utils import set_fixed_variables sage: key = set_fixed_variables('key', 'not_equal', list(range(16)), [0] * 16) sage: trail = cp.find_one_xor_linear_trail_with_fixed_weight(3, fixed_values=[key]) sage: trail['total_weight'] '3.0'
- find_possible_number_of_active_sboxes(weight)¶
Return a set whose numbers are the possible numbers of active S-boxes.
INPUT:
weight– integer; the fixed weight that must be able to be obtained with the found numbers of active S-boxes
EXAMPLES:
sage: from claasp.ciphers.block_ciphers.midori_block_cipher import MidoriBlockCipher sage: from claasp.cipher_modules.models.cp.mzn_model import MznModel sage: midori = MidoriBlockCipher() sage: cp = MznModel(midori) sage: model = cp.find_possible_number_of_active_sboxes(9) sage: model {3, 4}
- fix_variables_value_constraints(fixed_variables=[], step='full_model')¶
Return a list of CP constraints that fix the input variables to a specific value.
INPUT:
fixed_variables– list (default: []); dictionaries containing name, bit_size, value (as integer) for the variables that need to be fixed to a certain value:- {
‘component_id’: ‘plaintext’,
‘constraint_type’: ‘equal’/’not_equal’
‘bit_size’: 32,
‘value’: 753
}
step– string (default: full_model)
EXAMPLES:
sage: from claasp.cipher_modules.models.cp.mzn_model import MznModel sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: from claasp.cipher_modules.models.utils import set_fixed_variables, integer_to_bit_list sage: speck = SpeckBlockCipher(block_bit_size=32, key_bit_size=64, number_of_rounds=4) sage: cp = MznModel(speck) sage: cp.fix_variables_value_constraints([set_fixed_variables('plaintext', 'equal', range(4), integer_to_bit_list(5, 4, 'big'))]) ['constraint plaintext[0] = 0 /\\ plaintext[1] = 1 /\\ plaintext[2] = 0 /\\ plaintext[3] = 1;'] sage: cp.fix_variables_value_constraints([set_fixed_variables('plaintext', 'not_equal', list(range(4)), integer_to_bit_list(5, 4, 'big'))]) ['constraint plaintext[0] != 0 \\/ plaintext[1] != 1 \\/ plaintext[2] != 0 \\/ plaintext[3] != 1;']
- fix_variables_value_constraints_for_ARX(fixed_variables=[])¶
Return a list of constraints that fix the input variables to a specific value.
INPUT:
fixed_variables– list (default: []); the variables to be fixed in standard format
See also
EXAMPLES:
sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_differential_model_arx_optimized import MznXorDifferentialModelARXOptimized sage: from claasp.ciphers.block_ciphers.raiden_block_cipher import RaidenBlockCipher sage: raiden = RaidenBlockCipher(number_of_rounds=1) sage: minizinc = MznXorDifferentialModelARXOptimized(raiden) sage: minizinc.build_xor_differential_trail_model() sage: fixed_variables = [{ ....: 'component_id': 'key', ....: 'constraint_type': 'equal', ....: 'bit_positions': [0, 1, 2, 3], ....: 'bit_values': [0, 1, 0, 1] ....: }] sage: minizinc.fix_variables_value_constraints_for_ARX(fixed_variables)[0] 'constraint key_y0 = 0;' sage: fixed_variables = [{ 'component_id': 'plaintext', ....: 'constraint_type': 'sum', ....: 'bit_positions': [0, 1, 2, 3], ....: 'operator': '>', ....: 'value': '0' }] sage: minizinc.fix_variables_value_constraints_for_ARX(fixed_variables)[0] 'constraint plaintext_y0+plaintext_y1+plaintext_y2+plaintext_y3>0;'
- fix_variables_value_xor_linear_constraints(fixed_variables=[])¶
Return a list of Cp constraints that fix the input variables to a specific value.
INPUT: -
fixed_variables– list (default: []); dictionaries containing name, bit_size,value (as integer) for the variables that need to be fixed to a certain value:
{
‘component_id’: ‘key’,
‘constraint_type’: ‘equal’
‘bit_positions’: [0, 1, 2, 3],
‘bit_values’: [1, 0, 1, 0],
}
EXAMPLES:
sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: from claasp.cipher_modules.models.utils import set_fixed_variables, integer_to_bit_list sage: speck = SpeckBlockCipher(block_bit_size=32, key_bit_size=64, number_of_rounds=4) sage: cp = MznXorLinearModel(speck) sage: cp.fix_variables_value_xor_linear_constraints([set_fixed_variables('plaintext', 'equal', list(range(4)), integer_to_bit_list(5, 4, 'big'))]) ['constraint plaintext_o[0] = 0 /\\ plaintext_o[1] = 1 /\\ plaintext_o[2] = 0 /\\ plaintext_o[3] = 1;'] sage: cp.fix_variables_value_xor_linear_constraints([set_fixed_variables('plaintext', 'not_equal', list(range(4)), integer_to_bit_list(5, 4, 'big'))]) ['constraint plaintext_o[0] != 0 \\/ plaintext_o[1] != 1 \\/ plaintext_o[2] != 0 \\/ plaintext_o[3] != 1;']
- property float_and_lat_values¶
- format_component_value(component_id, string)¶
- get_command_for_solver_process(input_file_path, model_type, solver_name, num_of_processors, timelimit)¶
- get_lat_values(lat_table, numadd)¶
- get_mix_column_all_inputs(input_bit_positions_1, input_id_link_1, numb_of_inp_1)¶
- get_total_weight(string_total_weight)¶
- get_word_operation_final_xor_linear_constraints(component, new_constraint)¶
- initialise_model()¶
- input_xor_linear_constraints()¶
Return lists of declarations and constraints for the first part of CP model for the xor linear model.
INPUT:
None
EXAMPLES:
sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: speck = SpeckBlockCipher(block_bit_size=32, key_bit_size=64, number_of_rounds=4) sage: cp = MznXorLinearModel(speck) sage: cp.input_xor_linear_constraints() (['array[0..31] of var 0..1: plaintext_o;', 'array[0..63] of var 0..1: key_o;', 'array[0..6] of var {0, 1600, 900, 200, 1100, 400, 1300, 600, 1500, 800, 100, 1000, 300, 1200, 500, 1400, 700}: p;', 'var int: weight = sum(p);'], [])
- property model_constraints¶
Return the model specified by
model_type.INPUT:
model_type– string; the model to retrieve
EXAMPLES:
sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: from claasp.cipher_modules.models.cp.mzn_model import MznModel sage: speck = SpeckBlockCipher(number_of_rounds=4) sage: cp = MznModel(speck) sage: cp.model_constraints() Traceback (most recent call last): ... ValueError: No model generated
- output_probability_per_round()¶
- parse_solver_information(output_to_parse, truncated=False, solve_external=True)¶
- set_component_solution_value(component_solution, truncated, value)¶
- solve(model_type, solver_name='chuffed', solve_external=False, timeout_in_seconds_=None, processes_=None, nr_solutions_=None, random_seed_=None, all_solutions_=False, intermediate_solutions_=False, free_search_=False, optimisation_level_=None)¶
Return the solution of the model.
INPUT:
model_type– string; the model to solve:‘cipher’
‘xor_differential’
‘xor_differential_one_solution’
‘xor_linear’
‘xor_linear_one_solution’
‘deterministic_truncated_xor_differential’
‘deterministic_truncated_xor_differential_one_solution’
‘impossible_xor_differential’
solver_name– string (default: None); the name of the solver. Available values are:'Chuffed''Gecode''COIN-BC'
num_of_processors– integer; the number of processors to be usedtimelimit– integer; time limit to output a result
EXAMPLES:
sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_differential_model import MznXorDifferentialModel sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: from claasp.cipher_modules.models.utils import set_fixed_variables, integer_to_bit_list sage: speck = SpeckBlockCipher(block_bit_size=32, key_bit_size=64, number_of_rounds=4) sage: cp = MznXorDifferentialModel(speck) sage: fixed_variables = [set_fixed_variables('key', 'equal', list(range(64)), integer_to_bit_list(0, 64, 'little')), set_fixed_variables('plaintext', 'not_equal', list(range(32)), integer_to_bit_list(0, 32, 'little'))] sage: cp.build_xor_differential_trail_model(-1, fixed_variables) sage: cp.solve('xor_differential', 'chuffed') # random [{'cipher_id': 'speck_p32_k64_o32_r4', ... 'total_weight': '5.0'}]
- solve_for_ARX(solver_name=None, timeout_in_seconds_=30, processes_=4, nr_solutions_=None, random_seed_=None, all_solutions_=False, intermediate_solutions_=False, free_search_=False, optimisation_level_=None)¶
Solve the model passed in str_model_path by using MiniZinc and str_solver.
INPUT:
model_type– string; the type of the model that has been solvedsolver_name– string (default: None); name of the solver to be used together with MiniZinctimeout_in_seconds_– integer (default: 30); time in seconds to interrupt the solving processprocesses_– integer (default: 4); set the number of processes the solver can use. (Only available when the-pflag is supported by the solver)nr_solutions_– integer (default: None); the requested number of solution. (Only available on satisfaction problems and when the-nflag is supported by the solver)random_seed_– integer (default: None); set the random seed for solver. (Only available when the-rflag is supported by the solver)intermediate_solutions_– boolean (default: False); request the solver to output any intermediate solutions that are found during the solving process. (Only available on optimisation problems and when the-aflag is supported by the solver)all_solutions_– boolean (default: False); request to solver to find all solutions. (Only available on satisfaction problems and when the-aflag is supported by the solver)free_search– boolean (default: False); allow the solver to ignore the search definition within the instance (Only available when the-fflag is supported by the solver)optimisation_level_– integer (default: None); set the MiniZinc compiler optimisation level0: Disable optimisation
1: Single pass optimisation (default)
2: Flatten twice to improve flattening decisions
3: Perform root-node-propagation
4: Probe bounds of all variables at the root node
5: Probe values of all variables at the root node
EXAMPLES:
sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_differential_model_arx_optimized import MznXorDifferentialModelARXOptimized sage: speck = SpeckBlockCipher(number_of_rounds=5, block_bit_size=32, key_bit_size=64) sage: minizinc = MznXorDifferentialModelARXOptimized(speck) sage: bit_positions = [i for i in range(speck.output_bit_size)] sage: bit_positions_key = list(range(64)) sage: fixed_variables = [{ 'component_id': 'plaintext', ....: 'constraint_type': 'sum', ....: 'bit_positions': bit_positions, ....: 'operator': '>', ....: 'value': '0' }] sage: fixed_variables.append({ 'component_id': 'key', ....: 'constraint_type': 'sum', ....: 'bit_positions': bit_positions_key, ....: 'operator': '=', ....: 'value': '0' }) sage: minizinc.build_xor_differential_trail_model(-1, fixed_variables) sage: result = minizinc.solve_for_ARX('Xor') sage: result.statistics['nSolutions'] 1
- solver_names(verbose=False)¶
- update_and_or_lat_valid_probabilities(and_already_added, component, cp_declarations, valid_probabilities)¶
- update_sbox_lat_valid_probabilities(component, valid_probabilities)¶
- weight_constraints(weight)¶
Return a list of CP constraints that fix the total weight to a specific value.
INPUT:
weight– integer; a specific weight. If set to non-negative integer, fixes the XOR trail weight
EXAMPLES:
sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: from claasp.cipher_modules.models.cp.mzn_model import MznModel sage: speck = SpeckBlockCipher(block_bit_size=32, key_bit_size=64, number_of_rounds=4) sage: cp = MznModel(speck) sage: cp.weight_constraints(10) (['constraint weight = 1000;'], [])
- weight_xor_linear_constraints(weight)¶
Return a list of Cp constraints that fix the total weight to a specific value for xor linear model.
INPUT:
weight– integer; a specific weight. If set to non-negative integer, fixes the XOR trail weight
EXAMPLES:
sage: from claasp.ciphers.block_ciphers.speck_block_cipher import SpeckBlockCipher sage: from claasp.cipher_modules.models.cp.mzn_models.mzn_xor_linear_model import MznXorLinearModel sage: speck = SpeckBlockCipher(block_bit_size=32, key_bit_size=64, number_of_rounds=4) sage: cp = MznXorLinearModel(speck) sage: cp.weight_xor_linear_constraints(10) (['constraint weight = 1000;'], [])