This is an automated email from the ASF dual-hosted git repository.
mssun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-teaclave.git
The following commit(s) were added to refs/heads/master by this push:
new d3c3de5 [examples, sdk] Add the mesapy_echo example and move some
functions into Python SDK (#302)
d3c3de5 is described below
commit d3c3de56e9e72568e755b1de32a77aae324ff01c
Author: Mingshen Sun <[email protected]>
AuthorDate: Mon May 18 17:38:35 2020 -0700
[examples, sdk] Add the mesapy_echo example and move some functions into
Python SDK (#302)
---
cmake/scripts/test.sh | 2 +
docs/my-first-function.md | 2 +-
examples/python/builtin_echo.py | 77 +----------------
.../python/{builtin_echo.py => mesapy_echo.py} | 97 ++++------------------
sdk/python/__init__.py | 0
sdk/python/teaclave.py | 73 ++++++++++++++++
6 files changed, 95 insertions(+), 156 deletions(-)
diff --git a/cmake/scripts/test.sh b/cmake/scripts/test.sh
index a7840cf..653abfe 100755
--- a/cmake/scripts/test.sh
+++ b/cmake/scripts/test.sh
@@ -155,7 +155,9 @@ run_examples() {
sleep 3 # wait for execution services
popd
+ export PYTHONPATH=${TEACLAVE_PROJECT_ROOT}/sdk/python
python3 ${TEACLAVE_PROJECT_ROOT}/examples/python/builtin_echo.py
+ python3 ${TEACLAVE_PROJECT_ROOT}/examples/python/mesapy_echo.py
# kill all background services
cleanup
diff --git a/docs/my-first-function.md b/docs/my-first-function.md
index a377e8f..b6e5268 100644
--- a/docs/my-first-function.md
+++ b/docs/my-first-function.md
@@ -107,7 +107,7 @@ Then, run the echo example:
```
$ cd examples/python
-$ python3 builtin_echo.py 'Hello, Teaclave!'
+$ PYTHONPATH=../../sdk/python python3 builtin_echo.py 'Hello, Teaclave!'
[+] registering user
[+] login
[+] registering function
diff --git a/examples/python/builtin_echo.py b/examples/python/builtin_echo.py
index 7056bce..0a0a76d 100644
--- a/examples/python/builtin_echo.py
+++ b/examples/python/builtin_echo.py
@@ -1,21 +1,12 @@
#!/usr/bin/env python3
import socket
-import struct
import ssl
-import json
-import base64
-import toml
import os
import time
import sys
-from cryptography import x509
-from cryptography.hazmat.backends import default_backend
-
-from OpenSSL.crypto import load_certificate, FILETYPE_PEM, FILETYPE_ASN1
-from OpenSSL.crypto import X509Store, X509StoreContext
-from OpenSSL import crypto
+from teaclave import read_message, write_message, verify_report
HOSTNAME = 'localhost'
AUTHENTICATION_SERVICE_ADDRESS = (HOSTNAME, 7776)
@@ -40,65 +31,6 @@ else:
ENCLAVE_INFO_PATH = "../../release/tests/enclave_info.toml"
-def write_message(sock, message):
- message = json.dumps(message)
- message = message.encode()
- sock.write(struct.pack(">Q", len(message)))
- sock.write(message)
-
-
-def read_message(sock):
- response_len = struct.unpack(">Q", sock.read(8))
- response = sock.read(response_len[0])
- response = json.loads(response)
- return response
-
-
-def verify_report(cert, endpoint_name):
- if os.environ.get('SGX_MODE') == 'SW':
- return
-
- cert = x509.load_der_x509_certificate(cert, default_backend())
- ext = json.loads(cert.extensions[0].value.value)
-
- report = bytes(ext["report"])
- signature = bytes(ext["signature"])
- signing_cert = bytes(ext["signing_cert"])
- signing_cert = load_certificate(FILETYPE_ASN1, signing_cert)
-
- # verify signing cert with AS root cert
- with open(AS_ROOT_CA_CERT_PATH) as f:
- as_root_ca_cert = f.read()
- as_root_ca_cert = load_certificate(FILETYPE_PEM, as_root_ca_cert)
- store = X509Store()
- store.add_cert(as_root_ca_cert)
- store.add_cert(signing_cert)
- store_ctx = X509StoreContext(store, as_root_ca_cert)
- store_ctx.verify_certificate()
-
- # verify report's signature
- crypto.verify(signing_cert, signature, bytes(ext["report"]), 'sha256')
-
- report = json.loads(report)
- quote = report['isvEnclaveQuoteBody']
- quote = base64.b64decode(quote)
-
- # get mr_enclave and mr_signer from the quote
- mr_enclave = quote[112:112+32].hex()
- mr_signer = quote[176:176+32].hex()
-
- # get enclave_info
- enclave_info = toml.load(ENCLAVE_INFO_PATH)
-
- # verify mr_enclave and mr_signer
- enclave_name = "teaclave_" + endpoint_name + "_service"
- if mr_enclave != enclave_info[enclave_name]["mr_enclave"]:
- raise Exception("mr_enclave error")
-
- if mr_signer != enclave_info[enclave_name]["mr_signer"]:
- raise Exception("mr_signer error")
-
-
def user_register(channel, user_id, user_password):
message = {
"request": "user_register",
@@ -223,7 +155,7 @@ class BuiltinEchoExample:
sock = socket.create_connection(AUTHENTICATION_SERVICE_ADDRESS)
channel = CONTEXT.wrap_socket(sock, server_hostname=HOSTNAME)
cert = channel.getpeercert(binary_form=True)
- verify_report(cert, "authentication")
+ verify_report(AS_ROOT_CA_CERT_PATH, ENCLAVE_INFO_PATH, cert,
"authentication")
print("[+] registering user")
user_register(channel, self.user_id, self.user_password)
@@ -234,7 +166,7 @@ class BuiltinEchoExample:
sock = socket.create_connection(FRONTEND_SERVICE_ADDRESS)
channel = CONTEXT.wrap_socket(sock, server_hostname=HOSTNAME)
cert = channel.getpeercert(binary_form=True)
- verify_report(cert, "frontend")
+ verify_report(AS_ROOT_CA_CERT_PATH, ENCLAVE_INFO_PATH, cert,
"frontend")
print("[+] registering function")
function_id = register_function(channel, self.user_id, token)
@@ -242,9 +174,6 @@ class BuiltinEchoExample:
print("[+] creating task")
task_id = create_task(channel, self.user_id,
token, function_id, message)
- print("[+] approving task")
- approve_task(channel, self.user_id, token, task_id)
-
print("[+] invoking task")
invoke_task(channel, self.user_id, token, task_id)
diff --git a/examples/python/builtin_echo.py b/examples/python/mesapy_echo.py
similarity index 65%
copy from examples/python/builtin_echo.py
copy to examples/python/mesapy_echo.py
index 7056bce..313af1c 100644
--- a/examples/python/builtin_echo.py
+++ b/examples/python/mesapy_echo.py
@@ -1,21 +1,12 @@
#!/usr/bin/env python3
import socket
-import struct
import ssl
-import json
-import base64
-import toml
import os
import time
import sys
-from cryptography import x509
-from cryptography.hazmat.backends import default_backend
-
-from OpenSSL.crypto import load_certificate, FILETYPE_PEM, FILETYPE_ASN1
-from OpenSSL.crypto import X509Store, X509StoreContext
-from OpenSSL import crypto
+from teaclave import read_message, write_message, verify_report
HOSTNAME = 'localhost'
AUTHENTICATION_SERVICE_ADDRESS = (HOSTNAME, 7776)
@@ -40,65 +31,6 @@ else:
ENCLAVE_INFO_PATH = "../../release/tests/enclave_info.toml"
-def write_message(sock, message):
- message = json.dumps(message)
- message = message.encode()
- sock.write(struct.pack(">Q", len(message)))
- sock.write(message)
-
-
-def read_message(sock):
- response_len = struct.unpack(">Q", sock.read(8))
- response = sock.read(response_len[0])
- response = json.loads(response)
- return response
-
-
-def verify_report(cert, endpoint_name):
- if os.environ.get('SGX_MODE') == 'SW':
- return
-
- cert = x509.load_der_x509_certificate(cert, default_backend())
- ext = json.loads(cert.extensions[0].value.value)
-
- report = bytes(ext["report"])
- signature = bytes(ext["signature"])
- signing_cert = bytes(ext["signing_cert"])
- signing_cert = load_certificate(FILETYPE_ASN1, signing_cert)
-
- # verify signing cert with AS root cert
- with open(AS_ROOT_CA_CERT_PATH) as f:
- as_root_ca_cert = f.read()
- as_root_ca_cert = load_certificate(FILETYPE_PEM, as_root_ca_cert)
- store = X509Store()
- store.add_cert(as_root_ca_cert)
- store.add_cert(signing_cert)
- store_ctx = X509StoreContext(store, as_root_ca_cert)
- store_ctx.verify_certificate()
-
- # verify report's signature
- crypto.verify(signing_cert, signature, bytes(ext["report"]), 'sha256')
-
- report = json.loads(report)
- quote = report['isvEnclaveQuoteBody']
- quote = base64.b64decode(quote)
-
- # get mr_enclave and mr_signer from the quote
- mr_enclave = quote[112:112+32].hex()
- mr_signer = quote[176:176+32].hex()
-
- # get enclave_info
- enclave_info = toml.load(ENCLAVE_INFO_PATH)
-
- # verify mr_enclave and mr_signer
- enclave_name = "teaclave_" + endpoint_name + "_service"
- if mr_enclave != enclave_info[enclave_name]["mr_enclave"]:
- raise Exception("mr_enclave error")
-
- if mr_signer != enclave_info[enclave_name]["mr_signer"]:
- raise Exception("mr_signer error")
-
-
def user_register(channel, user_id, user_password):
message = {
"request": "user_register",
@@ -123,17 +55,23 @@ def user_login(channel, user_id, user_password):
def register_function(channel, user_id, token):
+ payload = b"""
+def entrypoint(argv):
+ assert argv[0] == 'message'
+ assert argv[1] is not None
+ return argv[1]
+"""
message = {
"metadata": {
"id": user_id,
"token": token
},
"request": "register_function",
- "name": "builtin-echo",
- "description": "Native Echo Function",
- "executor_type": "builtin",
+ "name": "mesapy-echo",
+ "description": "An echo function implemented in Python",
+ "executor_type": "python",
"public": True,
- "payload": [],
+ "payload": list(payload),
"arguments": ["message"],
"inputs": [],
"outputs": [],
@@ -155,7 +93,7 @@ def create_task(channel, user_id, token, function_id,
message):
"function_arguments": {
"message": message,
},
- "executor": "builtin",
+ "executor": "mesapy",
"inputs_ownership": [],
"outputs_ownership": [],
}
@@ -214,7 +152,7 @@ def get_task_result(channel, user_id, token, task_id):
return response["content"]["result"]["result"]["Ok"]["return_value"]
-class BuiltinEchoExample:
+class MesaPyEchoExample:
def __init__(self, user_id, user_password):
self.user_id = user_id
self.user_password = user_password
@@ -223,7 +161,7 @@ class BuiltinEchoExample:
sock = socket.create_connection(AUTHENTICATION_SERVICE_ADDRESS)
channel = CONTEXT.wrap_socket(sock, server_hostname=HOSTNAME)
cert = channel.getpeercert(binary_form=True)
- verify_report(cert, "authentication")
+ verify_report(AS_ROOT_CA_CERT_PATH, ENCLAVE_INFO_PATH, cert,
"authentication")
print("[+] registering user")
user_register(channel, self.user_id, self.user_password)
@@ -234,7 +172,7 @@ class BuiltinEchoExample:
sock = socket.create_connection(FRONTEND_SERVICE_ADDRESS)
channel = CONTEXT.wrap_socket(sock, server_hostname=HOSTNAME)
cert = channel.getpeercert(binary_form=True)
- verify_report(cert, "frontend")
+ verify_report(AS_ROOT_CA_CERT_PATH, ENCLAVE_INFO_PATH, cert,
"frontend")
print("[+] registering function")
function_id = register_function(channel, self.user_id, token)
@@ -242,9 +180,6 @@ class BuiltinEchoExample:
print("[+] creating task")
task_id = create_task(channel, self.user_id,
token, function_id, message)
- print("[+] approving task")
- approve_task(channel, self.user_id, token, task_id)
-
print("[+] invoking task")
invoke_task(channel, self.user_id, token, task_id)
@@ -256,7 +191,7 @@ class BuiltinEchoExample:
def main():
- example = BuiltinEchoExample(USER_ID, USER_PASSWORD)
+ example = MesaPyEchoExample(USER_ID, USER_PASSWORD)
if len(sys.argv) > 1:
message = sys.argv[1]
rt = example.echo(message)
diff --git a/sdk/python/__init__.py b/sdk/python/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/sdk/python/teaclave.py b/sdk/python/teaclave.py
new file mode 100644
index 0000000..c7b7421
--- /dev/null
+++ b/sdk/python/teaclave.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python3
+
+import struct
+import json
+import base64
+import toml
+import os
+
+from cryptography import x509
+from cryptography.hazmat.backends import default_backend
+
+from OpenSSL.crypto import load_certificate, FILETYPE_PEM, FILETYPE_ASN1
+from OpenSSL.crypto import X509Store, X509StoreContext
+from OpenSSL import crypto
+
+
+def write_message(sock, message):
+ message = json.dumps(message)
+ message = message.encode()
+ sock.write(struct.pack(">Q", len(message)))
+ sock.write(message)
+
+
+def read_message(sock):
+ response_len = struct.unpack(">Q", sock.read(8))
+ response = sock.read(response_len[0])
+ response = json.loads(response)
+ return response
+
+
+def verify_report(as_root_ca_cert_path, enclave_info_path, cert,
endpoint_name):
+ if os.environ.get('SGX_MODE') == 'SW':
+ return
+
+ cert = x509.load_der_x509_certificate(cert, default_backend())
+ ext = json.loads(cert.extensions[0].value.value)
+
+ report = bytes(ext["report"])
+ signature = bytes(ext["signature"])
+ signing_cert = bytes(ext["signing_cert"])
+ signing_cert = load_certificate(FILETYPE_ASN1, signing_cert)
+
+ # verify signing cert with AS root cert
+ with open(as_root_ca_cert_path) as f:
+ as_root_ca_cert = f.read()
+ as_root_ca_cert = load_certificate(FILETYPE_PEM, as_root_ca_cert)
+ store = X509Store()
+ store.add_cert(as_root_ca_cert)
+ store.add_cert(signing_cert)
+ store_ctx = X509StoreContext(store, as_root_ca_cert)
+ store_ctx.verify_certificate()
+
+ # verify report's signature
+ crypto.verify(signing_cert, signature, bytes(ext["report"]), 'sha256')
+
+ report = json.loads(report)
+ quote = report['isvEnclaveQuoteBody']
+ quote = base64.b64decode(quote)
+
+ # get mr_enclave and mr_signer from the quote
+ mr_enclave = quote[112:112+32].hex()
+ mr_signer = quote[176:176+32].hex()
+
+ # get enclave_info
+ enclave_info = toml.load(enclave_info_path)
+
+ # verify mr_enclave and mr_signer
+ enclave_name = "teaclave_" + endpoint_name + "_service"
+ if mr_enclave != enclave_info[enclave_name]["mr_enclave"]:
+ raise Exception("mr_enclave error")
+
+ if mr_signer != enclave_info[enclave_name]["mr_signer"]:
+ raise Exception("mr_signer error")
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]