| ... | @@ -175,6 +175,24 @@ pub fn set(comptime T: type, dest: []T, value: T) void { | ... | @@ -175,6 +175,24 @@ pub fn set(comptime T: type, dest: []T, value: T) void { |
| 175 | d.* = value; | 175 | d.* = value; |
| 176 | } | 176 | } |
| 177 | | 177 | |
| | 178 | pub fn secureZero(comptime T: type, s: []T) void { |
| | 179 | // NOTE: We do not use a volatile slice cast here since LLVM cannot |
| | 180 | // see that it can be replaced by a memset. |
| | 181 | const ptr = @ptrCast([*]volatile u8, s.ptr); |
| | 182 | const len = s.len * @sizeOf(T); |
| | 183 | @memset(ptr, 0, len); |
| | 184 | } |
| | 185 | |
| | 186 | test "mem.secureZero" { |
| | 187 | var a = []u8{0xfe} ** 8; |
| | 188 | var b = []u8{0xfe} ** 8; |
| | 189 | |
| | 190 | set(u8, a[0..], 0); |
| | 191 | secureZero(u8, b[0..]); |
| | 192 | |
| | 193 | assert(eql(u8, a[0..], b[0..])); |
| | 194 | } |
| | 195 | |
| 178 | pub fn compare(comptime T: type, lhs: []const T, rhs: []const T) Compare { | 196 | pub fn compare(comptime T: type, lhs: []const T, rhs: []const T) Compare { |
| 179 | const n = math.min(lhs.len, rhs.len); | 197 | const n = math.min(lhs.len, rhs.len); |
| 180 | var i: usize = 0; | 198 | var i: usize = 0; |