tem_ruby 0.10.3 → 0.11
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +2 -0
- data/lib/tem/definitions/isa.rb +8 -2
- data/lib/tem/sec_exec_error.rb +34 -8
- data/lib/tem/seclosures.rb +1 -6
- data/lib/tem/secpack.rb +26 -2
- data/tem_ruby.gemspec +1 -1
- data/test/tem_unit/test_tem_bound_secpack.rb +14 -7
- data/test/tem_unit/test_tem_branching.rb +26 -0
- metadata +1 -1
data/CHANGELOG
CHANGED
data/lib/tem/definitions/isa.rb
CHANGED
@@ -129,14 +129,20 @@ module Tem::Isa
|
|
129
129
|
:reladdr => 2}
|
130
130
|
isa.instruction 0x25, :jle, {:name => :to, :type => :tem_ushort,
|
131
131
|
:reladdr => 2}
|
132
|
+
|
133
|
+
# 0 ST -> 1 ST; IP
|
134
|
+
isa.instruction 0x3E, :call, {:name => :proc, :type => :tem_ushort,
|
135
|
+
:reladdr => 2}
|
136
|
+
# 1 ST -> 0 ST; IP (without IM)
|
137
|
+
isa.instruction 0x3F, :ret
|
132
138
|
|
133
139
|
# 1 IM_B -> 1 ST
|
134
140
|
isa.instruction 0x30, :ldbc, {:name => :const, :type => :tem_byte}
|
135
141
|
# 1 IM -> 1 ST
|
136
142
|
isa.instruction 0x31, :ldwc, {:name => :const, :type => :tem_short}
|
137
|
-
#
|
143
|
+
# 0 ST -> 1 ST
|
138
144
|
isa.instruction 0x32, :ldb, {:name => :from, :type => :tem_ushort}
|
139
|
-
#
|
145
|
+
# 0 ST -> 1 ST
|
140
146
|
isa.instruction 0x33, :ldw, {:name => :from, :type => :tem_ushort}
|
141
147
|
# 1 ST -> 1 ST
|
142
148
|
isa.instruction 0x36, :ldbv
|
data/lib/tem/sec_exec_error.rb
CHANGED
@@ -4,20 +4,43 @@ class Tem::SecExecError < StandardError
|
|
4
4
|
attr_reader :buffer_state, :key_state
|
5
5
|
attr_reader :trace
|
6
6
|
|
7
|
-
def initialize(
|
7
|
+
def initialize(secpack, tem_trace, buffer_state, key_state)
|
8
8
|
super 'SEC execution failed on the TEM'
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
|
10
|
+
if tem_trace
|
11
|
+
if tem_trace[:ip]
|
12
|
+
@ip_line_info = secpack.line_info_for_addr tem_trace[:ip]
|
13
|
+
@ip_label_info = secpack.label_info_for_addr tem_trace[:ip]
|
14
|
+
end
|
15
|
+
if tem_trace[:sp]
|
16
|
+
@sp_line_info = secpack.line_info_for_addr tem_trace[:sp]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
@ip_line_info ||= [0, :unknown, []]
|
20
|
+
@ip_label_info ||= [0, :unknown]
|
21
|
+
@sp_line_info ||= [0, :unknown, []]
|
22
|
+
|
23
|
+
line_ip, atom, backtrace = *@ip_line_info
|
24
|
+
set_backtrace backtrace
|
25
|
+
@ip_atom = atom
|
26
|
+
@ip_label = @ip_label_info[1]
|
12
27
|
if tem_trace and tem_trace[:ip]
|
13
28
|
@ip_delta = tem_trace[:ip] - line_ip
|
29
|
+
@ip_label_delta = tem_trace[:ip] - @ip_label_info[0]
|
14
30
|
else
|
15
|
-
@ip_delta = 0
|
31
|
+
@ip_delta = @ip_label_delta = 0
|
16
32
|
end
|
33
|
+
line_sp, atom, backtrace = *@sp_line_info
|
34
|
+
@sp_atom = atom
|
35
|
+
if tem_trace and tem_trace[:sp]
|
36
|
+
@sp_delta = tem_trace[:sp] - line_sp
|
37
|
+
else
|
38
|
+
@sp_delta = 0
|
39
|
+
end
|
40
|
+
|
17
41
|
@trace = tem_trace
|
18
42
|
@buffer_state = buffer_state
|
19
43
|
@key_state = key_state
|
20
|
-
set_backtrace backtrace
|
21
44
|
end
|
22
45
|
|
23
46
|
def bstat_str
|
@@ -40,7 +63,10 @@ class Tem::SecExecError < StandardError
|
|
40
63
|
if @trace.nil?
|
41
64
|
"no trace available"
|
42
65
|
else
|
43
|
-
"ip=#{'%04x' % @trace[:ip]}
|
66
|
+
"ip=#{'%04x' % @trace[:ip]} (#{@ip_atom}+0x#{'%x' % @ip_delta}) " +
|
67
|
+
"sp=#{'%04x' % @trace[:sp]} (#{@sp_atom}+0x#{'%x' % @sp_delta}) " +
|
68
|
+
"out=#{'%04x' % @trace[:out]} " +
|
69
|
+
"pscell=#{'%04x' % @trace[:pscell]}"
|
44
70
|
end
|
45
71
|
end
|
46
72
|
|
@@ -52,7 +78,7 @@ TEM Trace: #{trace_str}
|
|
52
78
|
TEM Buffer Status:#{bstat_str}
|
53
79
|
TEM Key Status:#{kstat_str}
|
54
80
|
|
55
|
-
TEM execution error at #{@
|
81
|
+
TEM execution error at #{@ip_label}+0x#{'%x' % @ip_label_delta}:
|
56
82
|
ENDSTRING
|
57
83
|
string.strip
|
58
84
|
end
|
data/lib/tem/seclosures.rb
CHANGED
@@ -54,12 +54,7 @@ module Tem::SeClosures
|
|
54
54
|
b_stat = stat_buffers() rescue nil
|
55
55
|
k_stat = stat_keys() rescue nil
|
56
56
|
trace = sec_trace()
|
57
|
-
|
58
|
-
line_info = secpack.line_info_for_ip(trace[:ip])
|
59
|
-
else
|
60
|
-
line_info = [0, :unknown, Kernel.caller]
|
61
|
-
end
|
62
|
-
sec_exception = Tem::SecExecError.new line_info, trace, b_stat, k_stat
|
57
|
+
sec_exception = Tem::SecExecError.new secpack, trace, b_stat, k_stat
|
63
58
|
break
|
64
59
|
when 4 # persistent store fault
|
65
60
|
solve_psfault
|
data/lib/tem/secpack.rb
CHANGED
@@ -94,14 +94,38 @@ class Tem::SecPack
|
|
94
94
|
[tem_header, @body, [0] * @extra_bytes].flatten
|
95
95
|
end
|
96
96
|
|
97
|
-
def
|
97
|
+
def line_info_for_addr(addr)
|
98
98
|
return nil unless @lines
|
99
99
|
|
100
100
|
@lines.reverse_each do |info|
|
101
101
|
# If something breaks, it's likely to happen after the opcode of the
|
102
102
|
# offending instruction has been read, so assume offending_ip < ip.
|
103
|
-
return info if
|
103
|
+
return info if addr >= info[0]
|
104
104
|
end
|
105
105
|
return info.first
|
106
106
|
end
|
107
|
+
|
108
|
+
def label_info_for_addr(addr)
|
109
|
+
@labels.to_a.reverse_each do |info|
|
110
|
+
return info.reverse if addr >= info[1]
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# Methods for interacting with the plaintext content of a SECpack.
|
115
|
+
|
116
|
+
def set_value(label, abi_type, value)
|
117
|
+
expand_extra_bytes
|
118
|
+
raise "Unknown label #{label}" unless addr = @labels[label]
|
119
|
+
bytes = Tem::Abi.send :"to_#{abi_type}", value
|
120
|
+
@body[addr, bytes.length] = bytes
|
121
|
+
#trim_extra_bytes
|
122
|
+
end
|
123
|
+
|
124
|
+
def get_value(label, abi_type)
|
125
|
+
expand_extra_bytes
|
126
|
+
raise "Unknown label #{label}" unless addr = @labels[label]
|
127
|
+
value = Tem::Abi.send :"read_#{abi_type}", @body, addr
|
128
|
+
#trim_extra_bytes
|
129
|
+
value
|
130
|
+
end
|
107
131
|
end
|
data/tem_ruby.gemspec
CHANGED
@@ -18,13 +18,13 @@ module TemBoundSecpackTestCase
|
|
18
18
|
# Make sure the zero_bytes optimization doesn't screw things up.
|
19
19
|
s.zeros :tem_ubyte, 60
|
20
20
|
s.label :plain
|
21
|
+
s.zeros :tem_ubyte, 20
|
21
22
|
s.stack 4
|
22
23
|
}
|
23
24
|
|
24
25
|
sb = bound_sec.body
|
25
|
-
|
26
|
-
|
27
|
-
assert secret_found, 'test_bound_secpack needs rethinking: the unbound secpack does not contain the secret'
|
26
|
+
secret_offset = (0...sb.length).find { |i| secret == sb[i, secret.length] }
|
27
|
+
assert secret_offset, 'The unbound secpack does not contain the secret.'
|
28
28
|
|
29
29
|
bound_sec.bind pubk, :secret, :plain
|
30
30
|
if yaml_roundtrip
|
@@ -36,11 +36,18 @@ module TemBoundSecpackTestCase
|
|
36
36
|
assert_equal secret, result, 'TEM failed to decrypt secpack'
|
37
37
|
|
38
38
|
sb = bound_sec.body
|
39
|
-
0
|
39
|
+
assert !(0...sb.length).find { |i| secret == sb[i, secret.length] },
|
40
|
+
'Secret found unencrypted in bound secpack'
|
40
41
|
|
41
|
-
bound_sec.
|
42
|
-
|
43
|
-
|
42
|
+
assert_equal 0, bound_sec.get_value(:plain, :tem_ushort),
|
43
|
+
'SecPack plaintext corrupted during binding'
|
44
|
+
|
45
|
+
bound_sec.set_value :mess_place, :tem_ubyte,
|
46
|
+
bound_sec.get_value(:mess_place, :tem_ubyte) + 1
|
47
|
+
assert_raise(RuntimeError, "secpack validation isn't working") do
|
48
|
+
@tem.execute bound_sec
|
49
|
+
end
|
50
|
+
end
|
44
51
|
end
|
45
52
|
|
46
53
|
class TemBoundSecpackTest < TemTestCase
|
@@ -53,4 +53,30 @@ class TemBranchingTest < TemTestCase
|
|
53
53
|
0x10, 0x11, 0x12],
|
54
54
|
result, 'the branching unit isn\'t working well'
|
55
55
|
end
|
56
|
+
|
57
|
+
def test_calls
|
58
|
+
secpack = @tem.assemble { |s|
|
59
|
+
s.ldbc 4
|
60
|
+
s.outnew
|
61
|
+
s.call :proc1
|
62
|
+
s.call :proc1
|
63
|
+
s.call :proc1
|
64
|
+
s.call :proc1
|
65
|
+
s.halt
|
66
|
+
|
67
|
+
s.label :proc1
|
68
|
+
s.ldw :proc1var
|
69
|
+
s.dupn :n => 1
|
70
|
+
s.outb
|
71
|
+
s.ldbc 1
|
72
|
+
s.add
|
73
|
+
s.stw :proc1var
|
74
|
+
s.ret
|
75
|
+
s.label :proc1var
|
76
|
+
s.data :tem_short, 5
|
77
|
+
s.stack 3
|
78
|
+
}
|
79
|
+
result = @tem.execute secpack
|
80
|
+
assert_equal [5, 6, 7, 8], result, 'the branching unit isn\'t working well'
|
81
|
+
end
|
56
82
|
end
|