/
sgx.go
118 lines (102 loc) · 2.77 KB
/
sgx.go
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
package main
import (
"encoding/binary"
"fmt"
"strconv"
"strings"
"time"
"github.com/spf13/cobra"
"github.com/oasisprotocol/oasis-core/go/common/sgx"
"github.com/oasisprotocol/oasis-core/go/common/sgx/sigstruct"
"github.com/oasisprotocol/oasis-core/go/runtime/bundle"
)
// constructSigstruct constructs SIGSTRUCTS from provided arguments.
func constructSigstruct(bnd *bundle.Bundle) *sigstruct.Sigstruct {
// Load SIGSTRUCT fields.
var date time.Time
switch {
case dateStr == "":
date = time.Now()
default:
var err error
date, err = parseDate(dateStr)
if err != nil {
cobra.CheckErr(fmt.Errorf("failed to parse date: %w", err))
}
}
miscSelect, miscSelectMask, err := parseNumNum(miscelectMiscmask)
if err != nil {
cobra.CheckErr(fmt.Errorf("failed to parse miscselect: %w", err))
}
xfrm, xfrmMask, err := parseNumNum64(xfrm)
if err != nil {
cobra.CheckErr(fmt.Errorf("failed to parse xfrm: %w", err))
}
attributes, attributesMask, err := parseNumNum64(attributesAttributemask)
if err != nil {
cobra.CheckErr(fmt.Errorf("failed to parse attributes: %w", err))
}
attributesMask = ^attributesMask
if bit32 {
attributes &= ^uint64(sgx.AttributeMode64Bit)
attributesMask |= uint64(sgx.AttributeMode64Bit)
}
if debug {
attributes |= uint64(sgx.AttributeDebug)
attributesMask &= ^uint64(sgx.AttributeDebug)
}
mrEnclave, err := bnd.MrEnclave()
if err != nil {
cobra.CheckErr(fmt.Errorf("failed to get MRENCLAVE from bundle: %w", err))
}
return sigstruct.New(
sigstruct.WithBuildDate(date),
sigstruct.WithSwDefined(uint32toArray(swdefined)),
sigstruct.WithISVProdID(isvprodid),
sigstruct.WithISVSVN(isvsvn),
sigstruct.WithMiscSelect(miscSelect),
sigstruct.WithMiscSelectMask(^miscSelectMask),
sigstruct.WithAttributes(sgx.Attributes{
Flags: sgx.AttributesFlags(attributes),
Xfrm: xfrm,
}),
sigstruct.WithAttributesMask([2]uint64{
attributesMask,
^xfrmMask,
}),
sigstruct.WithEnclaveHash(*mrEnclave),
)
}
func parseDate(s string) (time.Time, error) {
return time.Parse("20060102", s)
}
func uint32toArray(v uint32) [4]byte {
slice := make([]byte, 4)
binary.LittleEndian.PutUint32(slice, swdefined)
arr := (*[4]byte)(slice)
return *arr
}
func parseNumNum(s string) (uint32, uint32, error) {
splits := strings.SplitN(s, "/", 2)
n1, err := strconv.ParseUint(splits[0], 0, 32)
if err != nil {
return 0, 0, err
}
n2, err := strconv.ParseUint(splits[1], 0, 32)
if err != nil {
return 0, 0, err
}
return uint32(n1), uint32(n2), nil
}
func parseNumNum64(s string) (uint64, uint64, error) {
splits := strings.SplitN(s, "/", 2)
n1, err := strconv.ParseUint(splits[0], 0, 64)
if err != nil {
return 0, 0, err
}
n2, err := strconv.ParseUint(splits[1], 0, 64)
if err != nil {
return 0, 0, err
}
return n1, n2, nil
}