| ... | ... | @@ -175,6 +175,24 @@ pub fn set(comptime T: type, dest: []T, value: T) void { |
| 175 | 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 | 196 | pub fn compare(comptime T: type, lhs: []const T, rhs: []const T) Compare { |
| 179 | 197 | const n = math.min(lhs.len, rhs.len); |
| 180 | 198 | var i: usize = 0; |