45 lines
1.2 KiB
Zig
45 lines
1.2 KiB
Zig
const std = @import("std");
|
|
const Sha256 = std.crypto.hash.sha2.Sha256;
|
|
|
|
pub fn isValid(string: []const u8) bool {
|
|
const chars = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
|
|
var val: u256 = 0;
|
|
|
|
for (string) |char| {
|
|
const index = std.mem.indexOf(u8, chars, &[1]u8{char});
|
|
if (index == null) {
|
|
return false;
|
|
}
|
|
val = val * 58 + index.?;
|
|
}
|
|
|
|
var bytes: [25]u8 = undefined;
|
|
|
|
var i: i8 = 24;
|
|
var actualI: usize = 0;
|
|
|
|
while (i >= 0) : (i -= 1) {
|
|
const castI: u8 = @intCast(i);
|
|
bytes[actualI] = @intCast((val >> castI * 8) & 0xFF);
|
|
actualI += 1;
|
|
}
|
|
|
|
var hash: [Sha256.digest_length]u8 = undefined;
|
|
const first21 = bytes[0..21];
|
|
|
|
Sha256.hash(first21, &hash, .{});
|
|
|
|
var hash2: [Sha256.digest_length]u8 = undefined;
|
|
Sha256.hash(&hash, &hash2, .{});
|
|
|
|
const firstFourHash = hash2[0..4];
|
|
const lastFour = bytes[21..25];
|
|
|
|
return std.mem.eql(u8, firstFourHash, lastFour);
|
|
}
|
|
|
|
pub fn main() !void {
|
|
std.debug.print("{}\n", .{isValid("1AGNa15ZQXAZUgFiqJ3i7Z2DPU2J6hW62i")});
|
|
std.debug.print("{}\n", .{isValid("17NdbrSGoUotzeGCcMMCqnFkEvLymoou9j")});
|
|
}
|