Skip to content

Commit b17c8f1

Browse files
committed
feat(sedlockctl): tool can now be used to unlock and set mbrdone
1 parent 4409626 commit b17c8f1

File tree

5 files changed

+303
-5
lines changed

5 files changed

+303
-5
lines changed

cmd/sedlockctl/main.go

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,12 @@ func main() {
2727
flag.Parse()
2828

2929
if flag.NArg() == 0 {
30-
fmt.Printf("Usage: %s [-flags ..] device\n", os.Args[0])
30+
fmt.Printf("Usage: %s [-flags ..] device [verb...]\n", os.Args[0])
31+
fmt.Printf("\nVerbs:\n")
32+
fmt.Printf(" list List all ranges (default)\n")
33+
fmt.Printf(" unlock-all Unlocks all ranges completely\n")
34+
fmt.Printf(" lock-all Lock all ranges completely\n")
35+
fmt.Printf(" mbr-done on|off Sets the MBRDone property (hide/show Shadow MBR)\n")
3136
return
3237
}
3338
d, err := drive.Open(flag.Arg(0))
@@ -95,6 +100,37 @@ func main() {
95100
}
96101
defer l.Close()
97102

103+
args := flag.Args()[1:]
104+
verb := "list"
105+
if len(args) > 0 {
106+
verb = args[0]
107+
}
108+
switch verb {
109+
case "list":
110+
list(l)
111+
case "unlock-all":
112+
unlockAll(l)
113+
case "lock-all":
114+
lockAll(l)
115+
case "mbr-done":
116+
if len(args) < 2 {
117+
log.Fatalf("Missing argument to mbr-done verb")
118+
}
119+
var v bool
120+
if args[1] == "on" {
121+
v = true
122+
} else if args[1] == "off" {
123+
v = false
124+
} else {
125+
log.Fatalf("Argument %q is not 'on' or 'off'", args[1])
126+
}
127+
setMBRDone(l, v)
128+
default:
129+
log.Fatalf("Unknown verb %q", verb)
130+
}
131+
}
132+
133+
func list(l *locking.LockingSP) {
98134
if len(l.Ranges) == 0 {
99135
log.Fatalf("No available locking ranges as this user\n")
100136
}
@@ -113,6 +149,40 @@ func main() {
113149
strr += " [read locked]"
114150
}
115151
}
152+
if r == l.GlobalRange {
153+
strr += " [global]"
154+
}
155+
if r.Name != nil {
156+
strr += fmt.Sprintf(" [name=%q]", *r.Name)
157+
}
116158
fmt.Printf("Range %3d: %s\n", i, strr)
117159
}
118160
}
161+
162+
func unlockAll(l *locking.LockingSP) {
163+
for i, r := range l.Ranges {
164+
if err := r.UnlockRead(); err != nil {
165+
log.Printf("Read unlock range %d failed: %v", i, err)
166+
}
167+
if err := r.UnlockWrite(); err != nil {
168+
log.Printf("Write unlock range %d failed: %v", i, err)
169+
}
170+
}
171+
}
172+
173+
func lockAll(l *locking.LockingSP) {
174+
for i, r := range l.Ranges {
175+
if err := r.LockRead(); err != nil {
176+
log.Printf("Read lock range %d failed: %v", i, err)
177+
}
178+
if err := r.LockWrite(); err != nil {
179+
log.Printf("Write lock range %d failed: %v", i, err)
180+
}
181+
}
182+
}
183+
184+
func setMBRDone(l *locking.LockingSP, v bool) {
185+
if err := l.SetMBRDone(v); err != nil {
186+
log.Fatalf("SetMBRDone failed: %v", err)
187+
}
188+
}

pkg/core/table/locking.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,20 @@ var (
1515
Locking_LockingTable = TableUID{0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00}
1616
LockingInfoObj RowUID = [8]byte{0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01}
1717
EnterpriseLockingInfoObj RowUID = [8]byte{0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00}
18+
MBRControlObj RowUID = [8]byte{0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x01}
1819
)
1920

2021
type EncryptSupport uint
2122
type KeysAvailableConds uint
2223

2324
type ResetType uint
2425

26+
const (
27+
ResetPowerOff ResetType = 0
28+
ResetHardware ResetType = 1
29+
ResetHotPlug ResetType = 2
30+
)
31+
2532
type LockingInfoRow struct {
2633
UID RowUID
2734
Name *string
@@ -252,3 +259,83 @@ func Locking_Get(s *core.Session, row RowUID) (*LockingRow, error) {
252259
}
253260
return &lr, nil
254261
}
262+
263+
func Locking_Set(s *core.Session, row *LockingRow) error {
264+
mc := NewSetCall(s, row.UID)
265+
266+
if row.Name != nil {
267+
mc.StartOptionalParameter(1, "Name")
268+
mc.Bytes([]byte(*row.Name))
269+
mc.EndOptionalParameter()
270+
}
271+
272+
// TODO: Add these columns
273+
//mc.StartOptionalParameter(3, "RangeStart")
274+
//mc.StartOptionalParameter(4, "RangeLength")
275+
//mc.StartOptionalParameter(5, "ReadLockEnabled")
276+
//mc.StartOptionalParameter(6, "WriteLockEnabled")
277+
278+
if row.ReadLockEnabled != nil {
279+
mc.StartOptionalParameter(5, "ReadLockEnabled")
280+
mc.Bool(*row.ReadLockEnabled)
281+
mc.EndOptionalParameter()
282+
}
283+
if row.WriteLockEnabled != nil {
284+
mc.StartOptionalParameter(6, "WriteLockEnabled")
285+
mc.Bool(*row.WriteLockEnabled)
286+
mc.EndOptionalParameter()
287+
}
288+
if row.ReadLocked != nil {
289+
mc.StartOptionalParameter(7, "ReadLocked")
290+
mc.Bool(*row.ReadLocked)
291+
mc.EndOptionalParameter()
292+
}
293+
294+
if row.WriteLocked != nil {
295+
mc.StartOptionalParameter(8, "WriteLocked")
296+
mc.Bool(*row.WriteLocked)
297+
mc.EndOptionalParameter()
298+
}
299+
300+
// TODO: Add these columns
301+
//mc.StartOptionalParameter(8, "WriteLocked")
302+
//mc.StartOptionalParameter(9, "LockOnReset")
303+
//mc.StartOptionalParameter(10, "ActiveKey")
304+
305+
FinishSetCall(s, mc)
306+
_, err := s.ExecuteMethod(mc)
307+
return err
308+
}
309+
310+
type MBRControl struct {
311+
Enable *bool
312+
Done *bool
313+
MBRDoneOnReset *[]ResetType
314+
}
315+
316+
func MBRControl_Set(s *core.Session, row *MBRControl) error {
317+
mc := NewSetCall(s, MBRControlObj)
318+
319+
if row.Enable != nil {
320+
mc.StartOptionalParameter(1, "Enable")
321+
mc.Bool(*row.Enable)
322+
mc.EndOptionalParameter()
323+
}
324+
if row.Done != nil {
325+
mc.StartOptionalParameter(2, "Done")
326+
mc.Bool(*row.Done)
327+
mc.EndOptionalParameter()
328+
}
329+
if row.MBRDoneOnReset != nil {
330+
mc.StartOptionalParameter(3, "MBRDoneOnReset")
331+
mc.StartList()
332+
for _, x := range *row.MBRDoneOnReset {
333+
mc.UInt(uint(x))
334+
}
335+
mc.EndList()
336+
mc.EndOptionalParameter()
337+
}
338+
FinishSetCall(s, mc)
339+
_, err := s.ExecuteMethod(mc)
340+
return err
341+
}

pkg/core/table/table.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@ var (
2727
Table_ColumnUID uint = 0
2828

2929
MethodIDEnterpriseGet core.MethodID = [8]byte{0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06}
30+
MethodIDEnterpriseSet core.MethodID = [8]byte{0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07}
3031
MethodIDGetACL core.MethodID = [8]byte{0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0D}
3132
MethodIDGet core.MethodID = [8]byte{0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16}
33+
MethodIDSet core.MethodID = [8]byte{0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x17}
3234
MethodIDNext core.MethodID = [8]byte{0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08}
3335
MethodIDAuthenticate core.MethodID = [8]byte{0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1C}
3436
MethodIDEnterpriseAuthenticate core.MethodID = [8]byte{0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0C}
@@ -196,3 +198,34 @@ func parseRowValues(rv stream.List) (map[string]interface{}, error) {
196198
}
197199
return res, nil
198200
}
201+
202+
func NewSetCall(s *core.Session, row RowUID) *core.MethodCall {
203+
setUID := core.MethodID{}
204+
if s.ProtocolLevel == core.ProtocolLevelEnterprise {
205+
copy(setUID[:], MethodIDEnterpriseSet[:])
206+
} else {
207+
copy(setUID[:], MethodIDSet[:])
208+
}
209+
mc := s.NewMethodCall(core.InvokingID(row), setUID)
210+
if s.ProtocolLevel == core.ProtocolLevelEnterprise {
211+
// The two first arguments in ESET are required, and RowValues has an extra list
212+
mc.StartList()
213+
mc.EndList()
214+
mc.StartList()
215+
mc.StartList()
216+
} else {
217+
mc.StartOptionalParameter(1, "Values")
218+
mc.StartList()
219+
}
220+
return mc
221+
}
222+
223+
func FinishSetCall(s *core.Session, mc *core.MethodCall) {
224+
if s.ProtocolLevel == core.ProtocolLevelEnterprise {
225+
mc.EndList()
226+
mc.EndList()
227+
} else {
228+
mc.EndList()
229+
mc.EndOptionalParameter()
230+
}
231+
}

pkg/locking/locking.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ type LockingSP struct {
3131
Ranges []*Range // Ranges[0] == GlobalRange
3232

3333
// These are always false on SSC Enterprise
34-
MBREnabled bool
35-
MBRDone bool
34+
MBREnabled bool
35+
MBRDone bool
36+
MBRDoneOnReset []table.ResetType
3637
}
3738

3839
func (l *LockingSP) Close() error {
@@ -122,8 +123,12 @@ func NewSession(cs *core.ControlSession, lmeta *LockingSPMeta, auth LockingSPAut
122123

123124
l := &LockingSP{Session: s}
124125

126+
// TODO: These can be read from the LockingSP instead, it would be cleaner
127+
// to not have to drag D0 in the SPMeta.
125128
l.MBRDone = lmeta.D0.Locking.MBRDone
126129
l.MBREnabled = lmeta.D0.Locking.MBREnabled
130+
// TODO: Set MBRDoneOnReset to real value
131+
l.MBRDoneOnReset = []table.ResetType{table.ResetPowerOff}
127132

128133
if err := fillRanges(s, l); err != nil {
129134
return nil, err
@@ -272,3 +277,8 @@ func initializeOpalFamily(s *core.Session, d0 *core.Level0Discovery, ic *initial
272277
// TODO: lockdown
273278
return nil
274279
}
280+
281+
func (l *LockingSP) SetMBRDone(v bool) error {
282+
mbr := &table.MBRControl{Done: &v}
283+
return table.MBRControl_Set(l.Session, mbr)
284+
}

0 commit comments

Comments
 (0)