You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@teaclave.apache.org by ms...@apache.org on 2021/02/22 22:37:32 UTC
[incubator-teaclave] 01/02: Update cmac format from string to bytes
array.
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
commit 2a5a7c176574f6b4821a447c49df201f65fa6135
Author: Mengyuan-L <me...@gmail.com>
AuthorDate: Thu Feb 18 21:17:02 2021 +0000
Update cmac format from string to bytes array.
---
examples/c/builtin_echo.c | 9 +++++-
examples/c/builtin_ordered_set_intersect.c | 37 ++++++++++++++++++----
examples/python/builtin_gbdt_train.py | 5 ++-
examples/python/builtin_ordered_set_intersect.py | 16 ++++++----
examples/python/builtin_password_check.py | 13 +++++---
.../python/builtin_private_join_and_compute.py | 23 ++++++++------
examples/python/builtin_rsa_sign.py | 5 ++-
examples/python/mesapy_logistic_reg.py | 16 ++++++----
sdk/python/teaclave.py | 4 +--
services/proto/src/proto/teaclave_common.proto | 2 +-
.../src/proto/teaclave_frontend_service.proto | 6 ++--
services/proto/src/teaclave_frontend_service.rs | 12 +++----
types/src/crypto.rs | 4 +++
types/src/task.rs | 12 +++----
14 files changed, 108 insertions(+), 56 deletions(-)
diff --git a/examples/c/builtin_echo.c b/examples/c/builtin_echo.c
index e8d2e35..37be293 100644
--- a/examples/c/builtin_echo.c
+++ b/examples/c/builtin_echo.c
@@ -181,11 +181,18 @@ int main() {
printf("[+] Task result in string: %s\n", task_result);
-bail:
ret = teaclave_close_frontend_service(frontend_client);
if (ret != 0) {
fprintf(stderr, "[-] Failed to close the frontend service client.\n");
}
return ret;
+
+bail:
+ ret = teaclave_close_frontend_service(frontend_client);
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to close the frontend service client.\n");
+ }
+
+ exit(-1);
}
diff --git a/examples/c/builtin_ordered_set_intersect.c b/examples/c/builtin_ordered_set_intersect.c
index 285f000..582b78a 100644
--- a/examples/c/builtin_ordered_set_intersect.c
+++ b/examples/c/builtin_ordered_set_intersect.c
@@ -39,7 +39,7 @@ typedef struct UserData {
char *password;
char *input_url;
char *output_url;
- char *input_cmac;
+ char input_cmac[16];
char key[16];
} UserData;
@@ -48,7 +48,7 @@ struct UserData user0_data = {
.password = "password",
.input_url = "http://localhost:6789/fixtures/functions/ordered_set_intersect/psi0.txt.enc",
.output_url = "http://localhost:6789/fixtures/functions/ordered_set_intersect/output_psi0.enc",
- .input_cmac = "e08adeb021e876ffe82234445e632121",
+ .input_cmac = {0xe0, 0x8a, 0xde, 0xb0, 0x21, 0xe8, 0x76, 0xff, 0xe8, 0x22, 0x34, 0x44, 0x5e, 0x63, 0x21, 0x21},
.key = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
struct UserData user1_data = {
@@ -56,7 +56,7 @@ struct UserData user1_data = {
.password = "password",
.input_url = "http://localhost:6789/fixtures/functions/ordered_set_intersect/psi1.txt.enc",
.output_url = "http://localhost:6789/fixtures/functions/ordered_set_intersect/output_psi1.enc",
- .input_cmac = "538dafbf7802d962bb01e2389b4e943a",
+ .input_cmac = {0x53, 0x8d, 0xaf, 0xbf, 0x78, 0x02, 0xd9, 0x62, 0xbb, 0x01, 0xe2, 0x38, 0x9b, 0x4e, 0x94, 0x3a},
.key = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
const char *register_function_request_serialized = QUOTE(
@@ -98,7 +98,7 @@ const char *register_input_serialized= QUOTE(
{
"request": "register_input_file",
"url": "%s",
- "cmac": "%s",
+ "cmac": %s,
"crypto_info": {
"schema": "teaclave-file-128",
"key": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
@@ -236,6 +236,17 @@ int set_task(struct FrontendClient *frontend_client, char *serialized_response,
return ret;
}
+char *format_cmac_to_string(UserData user_data){
+ static char cmac[128] = {0};
+ int n = 0;
+ n += sprintf (&cmac[n], "[%hhu", user_data.input_cmac[0]);
+ for (int i = 1; i < 16; i++) {
+ n += sprintf (&cmac[n], ",%hhu", user_data.input_cmac[i]);
+ }
+ sprintf (&cmac[n], "]");
+ return cmac;
+}
+
int main()
{
int ret = 0;
@@ -280,7 +291,7 @@ int main()
/* User0 register input data. */
printf("[+] %s register input data\n", user0_data.user_id);
snprintf(user0_serialized_input_request, BUFFER_SIZE, register_input_serialized, user0_data.input_url,
- user0_data.input_cmac);
+ format_cmac_to_string(user0_data));
memset(serialized_response, 0, BUFFER_SIZE);
serialized_response_len = BUFFER_SIZE;
ret = teaclave_register_input_file_serialized(client0, user0_serialized_input_request, serialized_response,
@@ -320,7 +331,7 @@ int main()
/* User1 register input data. */
printf("[+] %s register input data\n", user1_data.user_id);
snprintf(user1_serialized_input_request, BUFFER_SIZE, register_input_serialized, user1_data.input_url,
- user1_data.input_cmac);
+ format_cmac_to_string(user1_data));
memset(serialized_response, 0, BUFFER_SIZE);
serialized_response_len = BUFFER_SIZE;
ret = teaclave_register_input_file_serialized(client1, user1_serialized_input_request, serialized_response,
@@ -409,7 +420,6 @@ int main()
}
printf("[+] %s task result in string: %s\n", user1_data.user_id, user1_task_result);
-bail:
printf("close client - 0\n");
ret = teaclave_close_frontend_service(client0);
if (ret != 0) {
@@ -421,4 +431,17 @@ bail:
fprintf(stderr, "[-] Failed to close the frontend service client.\n");
}
return ret;
+
+bail:
+ printf("close client - 0\n");
+ ret = teaclave_close_frontend_service(client0);
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to close the frontend service client.\n");
+ }
+ printf("close client - 1\n");
+ ret = teaclave_close_frontend_service(client1);
+ if (ret != 0) {
+ fprintf(stderr, "[-] Failed to close the frontend service client.\n");
+ }
+ exit(-1);
}
diff --git a/examples/python/builtin_gbdt_train.py b/examples/python/builtin_gbdt_train.py
index 8db51ed..f3910aa 100644
--- a/examples/python/builtin_gbdt_train.py
+++ b/examples/python/builtin_gbdt_train.py
@@ -66,7 +66,10 @@ class BuiltinGbdtExample:
print("[+] registering input file")
url = "http://localhost:6789/fixtures/functions/gbdt_training/train.enc"
- cmac = "881adca6b0524472da0a9d0bb02b9af9"
+ cmac = [
+ 0x88, 0x1a, 0xdc, 0xa6, 0xb0, 0x52, 0x44, 0x72, 0xda, 0x0a, 0x9d,
+ 0x0b, 0xb0, 0x2b, 0x9a, 0xf9
+ ]
schema = "teaclave-file-128"
key = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
iv = []
diff --git a/examples/python/builtin_ordered_set_intersect.py b/examples/python/builtin_ordered_set_intersect.py
index 9cd9e9d..c32b9af 100644
--- a/examples/python/builtin_ordered_set_intersect.py
+++ b/examples/python/builtin_ordered_set_intersect.py
@@ -36,7 +36,7 @@ class UserData:
password,
input_url="",
output_url="",
- input_cmac="",
+ input_cmac=[],
key=[]):
self.user_id = user_id
self.password = password
@@ -51,15 +51,17 @@ OUTPUT_FILE_URL_PREFIX = "http://localhost:6789/fixtures/functions/ordered_set_i
USER_DATA_0 = UserData("user0", "password",
INPUT_FILE_URL_PREFIX + "psi0.txt.enc",
- OUTPUT_FILE_URL_PREFIX + "output_psi0.enc",
- "e08adeb021e876ffe82234445e632121",
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
+ OUTPUT_FILE_URL_PREFIX + "output_psi0.enc", [
+ 0xe0, 0x8a, 0xde, 0xb0, 0x21, 0xe8, 0x76, 0xff,
+ 0xe8, 0x22, 0x34, 0x44, 0x5e, 0x63, 0x21, 0x21
+ ], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
USER_DATA_1 = UserData("user1", "password",
INPUT_FILE_URL_PREFIX + "psi1.txt.enc",
- OUTPUT_FILE_URL_PREFIX + "output_psi1.enc",
- "538dafbf7802d962bb01e2389b4e943a",
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
+ OUTPUT_FILE_URL_PREFIX + "output_psi1.enc", [
+ 0x53, 0x8d, 0xaf, 0xbf, 0x78, 0x02, 0xd9, 0x62,
+ 0xbb, 0x01, 0xe2, 0x38, 0x9b, 0x4e, 0x94, 0x3a
+ ], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
class DataList:
diff --git a/examples/python/builtin_password_check.py b/examples/python/builtin_password_check.py
index fb87d42..4da8635 100644
--- a/examples/python/builtin_password_check.py
+++ b/examples/python/builtin_password_check.py
@@ -36,7 +36,7 @@ class UserData:
password,
input_url="",
encryption_algorithm="teaclave-file-128",
- input_cmac="",
+ input_cmac=[],
iv=[],
key=[]):
self.user_id = user_id
@@ -56,15 +56,20 @@ USER_DATA_0 = UserData(
"password",
"data:text/plain;base64,c+mpvRfZ0fboR0j3rTgOGDBiubSzlCt9", # base64 of encrypted string "password"
"aes-gcm-128",
- "e84748f7ad380e183062b9b4b3942b7d",
+ [
+ 0xe8, 0x47, 0x48, 0xf7, 0xad, 0x38, 0x0e, 0x18, 0x30, 0x62, 0xb9, 0xb4,
+ 0xb3, 0x94, 0x2b, 0x7d
+ ],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
# Data provider
USER_DATA_1 = UserData("user1", "password",
INPUT_FILE_URL_PREFIX + "exposed_passwords.txt.enc",
- "teaclave-file-128", "42b16c29edeb9ee0e4d219f3b5395946",
- [], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
+ "teaclave-file-128", [
+ 0x42, 0xb1, 0x6c, 0x29, 0xed, 0xeb, 0x9e, 0xe0,
+ 0xe4, 0xd2, 0x19, 0xf3, 0xb5, 0x39, 0x59, 0x46
+ ], [], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
class DataList:
diff --git a/examples/python/builtin_private_join_and_compute.py b/examples/python/builtin_private_join_and_compute.py
index 57d31f7..0699be3 100644
--- a/examples/python/builtin_private_join_and_compute.py
+++ b/examples/python/builtin_private_join_and_compute.py
@@ -36,7 +36,7 @@ class UserData:
password,
input_url="",
output_url="",
- input_cmac="",
+ input_cmac=[],
key=[]):
self.user_id = user_id
self.password = password
@@ -51,21 +51,24 @@ OUTPUT_FILE_URL_PREFIX = "http://localhost:6789/fixtures/functions/private_join_
USER_DATA_0 = UserData("user0", "password",
INPUT_FILE_URL_PREFIX + "bank_a.enc",
- OUTPUT_FILE_URL_PREFIX + "user0_output.enc",
- "7884a62894e7be50b9795ba22ce5ee7f",
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
+ OUTPUT_FILE_URL_PREFIX + "user0_output.enc", [
+ 0x78, 0x84, 0xa6, 0x28, 0x94, 0xe7, 0xbe, 0x50,
+ 0xb9, 0x79, 0x5b, 0xa2, 0x2c, 0xe5, 0xee, 0x7f
+ ], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
USER_DATA_1 = UserData("user1", "password",
INPUT_FILE_URL_PREFIX + "bank_b.enc",
- OUTPUT_FILE_URL_PREFIX + "user1_output.enc",
- "75b8e931887bd57564d93df31c282bb9",
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
+ OUTPUT_FILE_URL_PREFIX + "user1_output.enc", [
+ 0x75, 0xb8, 0xe9, 0x31, 0x88, 0x7b, 0xd5, 0x75,
+ 0x64, 0xd9, 0x3d, 0xf3, 0x1c, 0x28, 0x2b, 0xb9
+ ], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
USER_DATA_2 = UserData("user2", "password",
INPUT_FILE_URL_PREFIX + "bank_c.enc",
- OUTPUT_FILE_URL_PREFIX + "user2_output.enc",
- "35acf29139485067d1ae6212c0577b43",
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
+ OUTPUT_FILE_URL_PREFIX + "user2_output.enc", [
+ 0x35, 0xac, 0xf2, 0x91, 0x39, 0x48, 0x50, 0x67,
+ 0xd1, 0xae, 0x62, 0x12, 0xc0, 0x57, 0x7b, 0x43
+ ], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
USER_DATA_3 = UserData("user3", "password")
diff --git a/examples/python/builtin_rsa_sign.py b/examples/python/builtin_rsa_sign.py
index 1761550..1443f3d 100644
--- a/examples/python/builtin_rsa_sign.py
+++ b/examples/python/builtin_rsa_sign.py
@@ -56,7 +56,10 @@ def register_input_file(client):
--print-cmac
"""
url = "http://localhost:6789/fixtures/functions/rsa_sign/rsakey.enc"
- cmac = "4de3bb77327c82923640835c6e5ada66"
+ cmac = [
+ 0x4d, 0xe3, 0xbb, 0x77, 0x32, 0x7c, 0x82, 0x92, 0x36, 0x40, 0x83, 0x5c,
+ 0x6e, 0x5a, 0xda, 0x66
+ ]
schema = "teaclave-file-128"
key = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3]
iv = []
diff --git a/examples/python/mesapy_logistic_reg.py b/examples/python/mesapy_logistic_reg.py
index 6a1fcce..1e4423c 100644
--- a/examples/python/mesapy_logistic_reg.py
+++ b/examples/python/mesapy_logistic_reg.py
@@ -47,7 +47,7 @@ class UserClient:
class InputData:
def __init__(self,
input_url="",
- input_cmac="",
+ input_cmac=[],
key=[],
label="input_data_0",
schema="teaclave-file-128",
@@ -205,9 +205,10 @@ USER = UserClient("user0", "password")
fo_test = "http://localhost:6789/fixtures/functions/py_logistic_reg/testa.out"
train_inputs = [
- InputData(train,
- "057baff3598121d05cec6c5e9ce2aa39",
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ InputData(train, [
+ 0x05, 0x7b, 0xaf, 0xf3, 0x59, 0x81, 0x21, 0xd0, 0x5c, 0xec, 0x6c, 0x5e,
+ 0x9c, 0xe2, 0xaa, 0x39
+ ], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
label="input_train")
]
train_outputs = [
@@ -252,9 +253,10 @@ def main():
output_scaler_cmac = tc.get_output_cmac_by_tag(train_task_id,
"output_scaler")
predict_inputs = [
- InputData(predict,
- "ae168afac768fd53e5d90d8e4b594d27",
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ InputData(predict, [
+ 0xae, 0x16, 0x8a, 0xfa, 0xc7, 0x68, 0xfd, 0x53, 0xe5, 0xd9, 0x0d,
+ 0x8e, 0x4b, 0x59, 0x4d, 0x27
+ ], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
label="input_predict"),
InputData(params,
output_params_cmac,
diff --git a/sdk/python/teaclave.py b/sdk/python/teaclave.py
index d439b53..9d0d105 100644
--- a/sdk/python/teaclave.py
+++ b/sdk/python/teaclave.py
@@ -274,7 +274,7 @@ class RegisterFunctionRequest:
class RegisterInputFileRequest:
- def __init__(self, metadata: Metadata, url: str, cmac: str,
+ def __init__(self, metadata: Metadata, url: str, cmac: List[int],
crypto_info: CryptoInfo):
self.request = "register_input_file"
self.metadata = metadata
@@ -374,7 +374,7 @@ class FrontendClient:
return response["content"]["function_id"]
def register_input_file(self, url: str, schema: str, key: List[int],
- iv: List[int], cmac: str):
+ iv: List[int], cmac: List[int]):
request = RegisterInputFileRequest(self.metadata, url, cmac,
CryptoInfo(schema, key, iv))
_write_message(self.channel, request)
diff --git a/services/proto/src/proto/teaclave_common.proto b/services/proto/src/proto/teaclave_common.proto
index 155deeb..31aa6c1 100644
--- a/services/proto/src/proto/teaclave_common.proto
+++ b/services/proto/src/proto/teaclave_common.proto
@@ -14,7 +14,7 @@ message FileCryptoInfo {
message TaskOutputs {
bytes return_value = 1;
- map<string, string> tags_map = 2;
+ map<string, bytes> tags_map = 2;
}
message TaskFailure {
diff --git a/services/proto/src/proto/teaclave_frontend_service.proto b/services/proto/src/proto/teaclave_frontend_service.proto
index 0f7e313..b5114cc 100644
--- a/services/proto/src/proto/teaclave_frontend_service.proto
+++ b/services/proto/src/proto/teaclave_frontend_service.proto
@@ -6,7 +6,7 @@ import "teaclave_common.proto";
message RegisterInputFileRequest {
string url = 1;
- string cmac = 2;
+ bytes cmac = 2;
teaclave_common_proto.FileCryptoInfo crypto_info = 3;
}
@@ -63,7 +63,7 @@ message GetOutputFileRequest {
message GetOutputFileResponse {
repeated string owner = 1;
- string cmac = 2;
+ bytes cmac = 2;
}
message GetInputFileRequest {
@@ -72,7 +72,7 @@ message GetInputFileRequest {
message GetInputFileResponse {
repeated string owner = 1;
- string cmac = 2;
+ bytes cmac = 2;
}
message FunctionInput {
diff --git a/services/proto/src/teaclave_frontend_service.rs b/services/proto/src/teaclave_frontend_service.rs
index 311e397..e929bdf 100644
--- a/services/proto/src/teaclave_frontend_service.rs
+++ b/services/proto/src/teaclave_frontend_service.rs
@@ -545,7 +545,7 @@ impl std::convert::TryFrom<proto::RegisterInputFileRequest> for RegisterInputFil
fn try_from(proto: proto::RegisterInputFileRequest) -> Result<Self> {
let url = Url::parse(&proto.url)?;
- let cmac = FileAuthTag::from_hex(proto.cmac)?;
+ let cmac = FileAuthTag::from_bytes(&proto.cmac)?;
let crypto_info = proto
.crypto_info
.ok_or_else(|| anyhow!("missing crypto_info"))?
@@ -562,7 +562,7 @@ impl From<RegisterInputFileRequest> for proto::RegisterInputFileRequest {
fn from(request: RegisterInputFileRequest) -> Self {
Self {
url: request.url.into_string(),
- cmac: request.cmac.to_hex(),
+ cmac: request.cmac.to_bytes(),
crypto_info: Some(request.crypto_info.into()),
}
}
@@ -805,7 +805,7 @@ impl std::convert::TryFrom<proto::GetInputFileResponse> for GetInputFileResponse
fn try_from(proto: proto::GetInputFileResponse) -> Result<Self> {
Ok(Self {
owner: OwnerList::new(proto.owner),
- cmac: FileAuthTag::from_hex(proto.cmac)?,
+ cmac: FileAuthTag::from_bytes(&proto.cmac)?,
})
}
}
@@ -814,7 +814,7 @@ impl From<GetInputFileResponse> for proto::GetInputFileResponse {
fn from(request: GetInputFileResponse) -> Self {
Self {
owner: request.owner.into(),
- cmac: request.cmac.to_hex(),
+ cmac: request.cmac.to_bytes(),
}
}
}
@@ -846,7 +846,7 @@ impl std::convert::TryFrom<proto::GetOutputFileResponse> for GetOutputFileRespon
if proto.cmac.is_empty() {
None
} else {
- Some(FileAuthTag::from_hex(&proto.cmac)?)
+ Some(FileAuthTag::from_bytes(&proto.cmac)?)
}
};
@@ -861,7 +861,7 @@ impl From<GetOutputFileResponse> for proto::GetOutputFileResponse {
fn from(request: GetOutputFileResponse) -> Self {
Self {
owner: request.owner.into(),
- cmac: request.cmac.map_or_else(String::new, |cmac| cmac.to_hex()),
+ cmac: request.cmac.map_or_else(Vec::new, |cmac| cmac.to_bytes()),
}
}
}
diff --git a/types/src/crypto.rs b/types/src/crypto.rs
index 8c03586..48d7409 100644
--- a/types/src/crypto.rs
+++ b/types/src/crypto.rs
@@ -53,6 +53,10 @@ impl FileAuthTag {
hex::encode(&self.tag)
}
+ pub fn to_bytes(&self) -> Vec<u8> {
+ self.tag.to_vec()
+ }
+
#[cfg(test_mode)]
pub fn mock() -> Self {
Self {
diff --git a/types/src/task.rs b/types/src/task.rs
index 99a6a77..95c26d8 100644
--- a/types/src/task.rs
+++ b/types/src/task.rs
@@ -165,12 +165,12 @@ impl OutputsTags {
}
}
-impl std::convert::TryFrom<HashMap<String, String>> for OutputsTags {
+impl std::convert::TryFrom<HashMap<String, Vec<u8>>> for OutputsTags {
type Error = anyhow::Error;
- fn try_from(input: HashMap<String, String>) -> Result<Self> {
+ fn try_from(input: HashMap<String, Vec<u8>>) -> Result<Self> {
let mut ret = HashMap::with_capacity(input.len());
for (k, v) in input.iter() {
- let tag = FileAuthTag::from_hex(v)?;
+ let tag = FileAuthTag::from_bytes(&v)?;
ret.insert(k.to_string(), tag);
}
Ok(OutputsTags::new(ret))
@@ -178,11 +178,11 @@ impl std::convert::TryFrom<HashMap<String, String>> for OutputsTags {
}
impl<S: std::default::Default + std::hash::BuildHasher> std::convert::From<OutputsTags>
- for HashMap<String, String, S>
+ for HashMap<String, Vec<u8>, S>
{
- fn from(tags: OutputsTags) -> HashMap<String, String, S> {
+ fn from(tags: OutputsTags) -> HashMap<String, Vec<u8>, S> {
tags.iter()
- .map(|(k, v)| (k.to_string(), v.to_hex()))
+ .map(|(k, v)| (k.to_string(), v.to_bytes()))
.collect()
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@teaclave.apache.org
For additional commands, e-mail: commits-help@teaclave.apache.org