Patent ID: 8880882

Claim:
A method comprising: receiving, at a server system and from a client system, a request to instantiate a virtual machine, the request to instantiate the virtual machine including a public key of a public/private key pair associated with the client system; establishing a secure channel between the client system and the server system using the received public key, the establishing comprising one of: (i) encrypting a first plaintext using the received public key to generate a ciphertext; sending the ciphertext to the client system such that the client system is able to decrypt the ciphertext using a private key of the public/private key pair to generate a second plaintext; in response to sending the ciphertext to the client system, receiving the second plaintext from the client system; determining that the second plaintext is the same as the first plaintext; and in response to determining that the second plaintext is the same as the first plaintext, establishing the secure channel between the client system and the server system; or (ii) generating a first plaintext; sending the first plaintext to the client system such that the client system is able to encrypt the first plaintext using a private key of the public/private key pair to generate a ciphertext; in response to sending the first plaintext to the client system, receiving the ciphertext from the client system; decrypting the received ciphertext using the public key to generate a second plaintext; determining that the second plaintext is the same as the first plaintext; and in response to determining that the second plaintext is the same as the first plaintext, establishing the secure channel between the client system and the server system; receiving, at the server system and from the client system, code that when executed, performs computations on data; receiving, at the server system and from the client system through the secure channel, a request to execute the code to perform the computations on encrypted data stored at the server system; sending, from the server system and to the client system, a request for a data key configured to decrypt the encrypted data; receiving, at the server system and from the client system, the data key; accessing, at the server system, the encrypted data; decrypting, at the server system, the encrypted data using the data key to generate unencrypted data; performing, at the server system by executing the code received from the client system, the computations on the unencrypted data in the virtual machine to generate result data; and providing the result data to the client system.