예제 #1
0
파일: tape.py 프로젝트: zeta1999/arcanevm
    def generate_tape(self, size, ctx, secret_key):
        indices = []  # Encrypt indices before feeding into VM
        for x in range(size):
            self.add_cell(Number.from_plaintext(0, ctx, secret_key))
            indices.append(Number.from_plaintext(x, ctx, secret_key))

        return indices
예제 #2
0
    def setUp(self):
        self.context = FakeContext()
        self.sk = self.context.generate_keys()

        self.one = Number.from_plaintext(1, self.context, self.sk)
        self.two = Number.from_plaintext(2, self.context, self.sk)
        self.three = Number.from_plaintext(3, self.context, self.sk)
        self.zero = Number.from_plaintext(0, self.context, self.sk)
        self.two_five_four = Number.from_plaintext(254, self.context, self.sk)
        self.two_five_five = Number.from_plaintext(255, self.context, self.sk)

        utils.zero = Number.from_plaintext(0, self.context, self.sk, size=1)
        utils.one = Number.from_plaintext(1, self.context, self.sk, size=1)
예제 #3
0
파일: run.py 프로젝트: wmww/arcanevm
def run():
    ctx = nufhe.Context()
    secret_key, cloud_key = ctx.make_key_pair()
    vm = ctx.make_virtual_machine(cloud_key)

    # Create tape
    # Create VM
    # Execute instruction
    # Get output tape encrypted
    # Decrypt tape to get execution results

    tape = Tape()

    # Create tape of size n

    n = 2

    indices = []  # Encrypt indices before feeding into VM
    for x in range(n):
        tape.add_cell(Number.from_plaintext(0, ctx, secret_key))
        indices.append(Number.from_plaintext(x, ctx, secret_key))

    utils.logic = vm
    utils.flag = Number.from_plaintext(1, ctx, secret_key,
                                       size=1)  # Flag for conditions
    utils.one = Number.from_plaintext(1, ctx, secret_key, size=1)  # A one
    utils.zero = Number.from_plaintext(0, ctx, secret_key, size=1)  # A zero
    utils.data_ptr = Number.from_plaintext(0, ctx,
                                           secret_key)  # Cell to perform op on

    blind_machine = VirtualMachine(tape, indices)

    # Add 1 instruction
    """for x in range(3):
        inc_data_ptr = Number.from_plaintext(0, ctx, secret_key)
        inc_data_cell = Number.from_plaintext(1, ctx, secret_key)

        blind_machine.step(inc_data_ptr, inc_data_cell)
    """

    #print(utils.one + utils.one)

    A = 129
    B = 5

    sum = Number.from_plaintext(A, ctx, secret_key) + Number.from_plaintext(
        B, ctx, secret_key)

    print(sum.decrypt(ctx, secret_key))
    print(A, "+", B, "=", sum.decrypt(ctx, secret_key, decimal=True))
예제 #4
0
    def compile(code, instruction_set, ctx, secret_key):
        instructions = []
        for char in code:
            if char in instruction_set:
                instructions.append(instruction_set[char])

        instruction_indices = []

        for i, _ in enumerate(instructions):
            instruction_indices.append(
                Number.from_plaintext(i, ctx, secret_key))

        return instructions, instruction_indices
예제 #5
0
파일: test_vm.py 프로젝트: rdpli/arcanevm
    def setUp(self):
        ctx = FakeContext()
        secret_key = ctx.generate_keys()

        tape = Tape()
        tape_indices = tape.generate_tape(2, ctx, secret_key)

        utils.flag = Number.from_plaintext(1, ctx, secret_key, size=1)
        utils.one = Number.from_plaintext(1, ctx, secret_key, size=1)
        utils.zero = Number.from_plaintext(0, ctx, secret_key, size=1)

        # Initial state of machine

        data_ptr = Number.from_plaintext(0, ctx, secret_key)
        instruction_ptr = Number.from_plaintext(0, ctx, secret_key)

        # Defines instructions
        
        inc_data_ptr = Number.from_plaintext(1, ctx, secret_key)
        inc_data_cell = Number.from_plaintext(2, ctx, secret_key)
        dec_data_ptr = Number.from_plaintext(3, ctx, secret_key)
        dec_data_cell = Number.from_plaintext(4, ctx, secret_key)
        mark_loop = Number.from_plaintext(5, ctx, secret_key)
        loop_back = Number.from_plaintext(6, ctx, secret_key)


        instruction_set = {
            "+":inc_data_cell,
            "-":dec_data_cell,
            ">":inc_data_ptr,
            "<":dec_data_ptr,
            "[":mark_loop,
            "]":loop_back
        }

        instructions, instruction_indices = VirtualMachine.compile("++[>+++<-]", instruction_set, ctx, secret_key)
            
        self.blind_machine = VirtualMachine(
                tape,
                tape_indices,
                instruction_indices,
                instruction_set,
                instructions,
                instruction_ptr,
                data_ptr
        )

        self.context = ctx
        self.secret_key = secret_key
        self.tape = tape
예제 #6
0
    def setUp(self):
        self.context = FakeContext()
        self.sk = self.context.generate_keys()

        self.one = Number.from_plaintext(1, self.context, self.sk)
        self.zero = Number.from_plaintext(0, self.context, self.sk)
예제 #7
0
 def test_from_plaintext(self):
     one28 = Number.from_plaintext(128, self.context, self.sk)
     too_big = Number.from_plaintext(512, self.context, self.sk, size=8)
    
     self.assertEqual(too_big.decrypt(self.sk, decimal=True), 128)
     self.assertEqual(one28.decrypt(self.sk, decimal=True), 128)
예제 #8
0
def run(code, tape_size=2):
    ctx = NUFHEContext()
    #ctx = FakeContext()

    secret_key = ctx.generate_keys()

    # Create tape with size of 2

    tape = Tape()
    tape_indices = tape.generate_tape(tape_size, ctx, secret_key)

    utils.flag = Number.from_plaintext(1, ctx, secret_key, size=1)
    utils.one = Number.from_plaintext(1, ctx, secret_key, size=1)
    utils.zero = Number.from_plaintext(0, ctx, secret_key, size=1)

    # Initial state of machine

    data_ptr = Number.from_plaintext(0, ctx, secret_key)
    instruction_ptr = Number.from_plaintext(0, ctx, secret_key)

    # Defines instructions

    inc_data_ptr = Number.from_plaintext(1, ctx, secret_key)
    inc_data_cell = Number.from_plaintext(2, ctx, secret_key)
    dec_data_ptr = Number.from_plaintext(3, ctx, secret_key)
    dec_data_cell = Number.from_plaintext(4, ctx, secret_key)
    mark_loop = Number.from_plaintext(5, ctx, secret_key)
    loop_back = Number.from_plaintext(6, ctx, secret_key)

    instruction_set = {
        "+": inc_data_cell,
        "-": dec_data_cell,
        ">": inc_data_ptr,
        "<": dec_data_ptr,
        "[": mark_loop,
        "]": loop_back
    }

    instructions, instruction_indices = VirtualMachine.compile(
        code, instruction_set, ctx, secret_key)

    blind_machine = VirtualMachine(tape, tape_indices, instruction_indices,
                                   instruction_set, instructions,
                                   instruction_ptr, data_ptr)

    blind_machine.run()

    pprint.pprint(tape.decrypt_tape(secret_key))