1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
use crate::storage::Storable;
use crate::{FileAuthTag, FileCrypto, OwnerList};
use anyhow::{anyhow, Result};
use serde::{Deserialize, Serialize};
use url::Url;
use uuid::Uuid;
const INPUT_FILE_PREFIX: &str = "input";
const OUTPUT_FILE_PREFIX: &str = "output";
fn create_uuid() -> Uuid {
Uuid::new_v4()
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct TeaclaveInputFile {
pub url: Url,
pub cmac: FileAuthTag,
pub crypto_info: FileCrypto,
pub owner: OwnerList,
pub uuid: Uuid,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct TeaclaveOutputFile {
pub url: Url,
pub cmac: Option<FileAuthTag>,
pub crypto_info: FileCrypto,
pub owner: OwnerList,
pub uuid: Uuid,
}
impl TeaclaveInputFile {
pub fn new(
url: Url,
cmac: FileAuthTag,
crypto_info: FileCrypto,
owner: impl Into<OwnerList>,
) -> TeaclaveInputFile {
TeaclaveInputFile {
url,
cmac,
crypto_info,
owner: owner.into(),
uuid: create_uuid(),
}
}
pub fn from_output(output: TeaclaveOutputFile) -> Result<TeaclaveInputFile> {
let input = TeaclaveInputFile {
url: output.url,
cmac: output
.cmac
.ok_or_else(|| anyhow!("output is not finished"))?,
crypto_info: output.crypto_info,
owner: output.owner,
uuid: output.uuid,
};
Ok(input)
}
}
impl Storable for TeaclaveInputFile {
fn key_prefix() -> &'static str {
INPUT_FILE_PREFIX
}
fn uuid(&self) -> Uuid {
self.uuid
}
}
impl TeaclaveOutputFile {
pub fn new(
url: Url,
crypto_info: FileCrypto,
owner: impl Into<OwnerList>,
) -> TeaclaveOutputFile {
TeaclaveOutputFile {
url,
cmac: None,
crypto_info,
owner: owner.into(),
uuid: create_uuid(),
}
}
pub fn assign_cmac(&mut self, cmac: &FileAuthTag) -> Result<()> {
anyhow::ensure!(self.cmac.is_none(), "Cannot overwrite output file cmac");
self.cmac = Some(cmac.to_owned());
Ok(())
}
}
impl Storable for TeaclaveOutputFile {
fn key_prefix() -> &'static str {
OUTPUT_FILE_PREFIX
}
fn uuid(&self) -> Uuid {
self.uuid
}
}