mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
update std lib to take advantage of slicing with comptime indexes
This commit is contained in:
parent
1d7861a36e
commit
f614d94faa
@ -15,10 +15,10 @@ fn rotw(w: u32) u32 {
|
|||||||
|
|
||||||
// Encrypt one block from src into dst, using the expanded key xk.
|
// Encrypt one block from src into dst, using the expanded key xk.
|
||||||
fn encryptBlock(xk: []const u32, dst: []u8, src: []const u8) void {
|
fn encryptBlock(xk: []const u32, dst: []u8, src: []const u8) void {
|
||||||
var s0 = mem.readIntSliceBig(u32, src[0..4]);
|
var s0 = mem.readIntBig(u32, src[0..4]);
|
||||||
var s1 = mem.readIntSliceBig(u32, src[4..8]);
|
var s1 = mem.readIntBig(u32, src[4..8]);
|
||||||
var s2 = mem.readIntSliceBig(u32, src[8..12]);
|
var s2 = mem.readIntBig(u32, src[8..12]);
|
||||||
var s3 = mem.readIntSliceBig(u32, src[12..16]);
|
var s3 = mem.readIntBig(u32, src[12..16]);
|
||||||
|
|
||||||
// First round just XORs input with key.
|
// First round just XORs input with key.
|
||||||
s0 ^= xk[0];
|
s0 ^= xk[0];
|
||||||
@ -58,18 +58,18 @@ fn encryptBlock(xk: []const u32, dst: []u8, src: []const u8) void {
|
|||||||
s2 ^= xk[k + 2];
|
s2 ^= xk[k + 2];
|
||||||
s3 ^= xk[k + 3];
|
s3 ^= xk[k + 3];
|
||||||
|
|
||||||
mem.writeIntSliceBig(u32, dst[0..4], s0);
|
mem.writeIntBig(u32, dst[0..4], s0);
|
||||||
mem.writeIntSliceBig(u32, dst[4..8], s1);
|
mem.writeIntBig(u32, dst[4..8], s1);
|
||||||
mem.writeIntSliceBig(u32, dst[8..12], s2);
|
mem.writeIntBig(u32, dst[8..12], s2);
|
||||||
mem.writeIntSliceBig(u32, dst[12..16], s3);
|
mem.writeIntBig(u32, dst[12..16], s3);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decrypt one block from src into dst, using the expanded key xk.
|
// Decrypt one block from src into dst, using the expanded key xk.
|
||||||
pub fn decryptBlock(xk: []const u32, dst: []u8, src: []const u8) void {
|
pub fn decryptBlock(xk: []const u32, dst: []u8, src: []const u8) void {
|
||||||
var s0 = mem.readIntSliceBig(u32, src[0..4]);
|
var s0 = mem.readIntBig(u32, src[0..4]);
|
||||||
var s1 = mem.readIntSliceBig(u32, src[4..8]);
|
var s1 = mem.readIntBig(u32, src[4..8]);
|
||||||
var s2 = mem.readIntSliceBig(u32, src[8..12]);
|
var s2 = mem.readIntBig(u32, src[8..12]);
|
||||||
var s3 = mem.readIntSliceBig(u32, src[12..16]);
|
var s3 = mem.readIntBig(u32, src[12..16]);
|
||||||
|
|
||||||
// First round just XORs input with key.
|
// First round just XORs input with key.
|
||||||
s0 ^= xk[0];
|
s0 ^= xk[0];
|
||||||
@ -109,10 +109,10 @@ pub fn decryptBlock(xk: []const u32, dst: []u8, src: []const u8) void {
|
|||||||
s2 ^= xk[k + 2];
|
s2 ^= xk[k + 2];
|
||||||
s3 ^= xk[k + 3];
|
s3 ^= xk[k + 3];
|
||||||
|
|
||||||
mem.writeIntSliceBig(u32, dst[0..4], s0);
|
mem.writeIntBig(u32, dst[0..4], s0);
|
||||||
mem.writeIntSliceBig(u32, dst[4..8], s1);
|
mem.writeIntBig(u32, dst[4..8], s1);
|
||||||
mem.writeIntSliceBig(u32, dst[8..12], s2);
|
mem.writeIntBig(u32, dst[8..12], s2);
|
||||||
mem.writeIntSliceBig(u32, dst[12..16], s3);
|
mem.writeIntBig(u32, dst[12..16], s3);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn xorBytes(dst: []u8, a: []const u8, b: []const u8) usize {
|
fn xorBytes(dst: []u8, a: []const u8, b: []const u8) usize {
|
||||||
@ -154,8 +154,8 @@ fn AES(comptime keysize: usize) type {
|
|||||||
var n: usize = 0;
|
var n: usize = 0;
|
||||||
while (n < src.len) {
|
while (n < src.len) {
|
||||||
ctx.encrypt(keystream[0..], ctrbuf[0..]);
|
ctx.encrypt(keystream[0..], ctrbuf[0..]);
|
||||||
var ctr_i = std.mem.readIntSliceBig(u128, ctrbuf[0..]);
|
var ctr_i = std.mem.readIntBig(u128, ctrbuf[0..]);
|
||||||
std.mem.writeIntSliceBig(u128, ctrbuf[0..], ctr_i +% 1);
|
std.mem.writeIntBig(u128, ctrbuf[0..], ctr_i +% 1);
|
||||||
|
|
||||||
n += xorBytes(dst[n..], src[n..], &keystream);
|
n += xorBytes(dst[n..], src[n..], &keystream);
|
||||||
}
|
}
|
||||||
@ -251,7 +251,7 @@ fn expandKey(key: []const u8, enc: []u32, dec: []u32) void {
|
|||||||
var i: usize = 0;
|
var i: usize = 0;
|
||||||
var nk = key.len / 4;
|
var nk = key.len / 4;
|
||||||
while (i < nk) : (i += 1) {
|
while (i < nk) : (i += 1) {
|
||||||
enc[i] = mem.readIntSliceBig(u32, key[4 * i .. 4 * i + 4]);
|
enc[i] = mem.readIntBig(u32, key[4 * i ..][0..4]);
|
||||||
}
|
}
|
||||||
while (i < enc.len) : (i += 1) {
|
while (i < enc.len) : (i += 1) {
|
||||||
var t = enc[i - 1];
|
var t = enc[i - 1];
|
||||||
|
|||||||
@ -123,8 +123,7 @@ fn Blake2s(comptime out_len: usize) type {
|
|||||||
const rr = d.h[0 .. out_len / 32];
|
const rr = d.h[0 .. out_len / 32];
|
||||||
|
|
||||||
for (rr) |s, j| {
|
for (rr) |s, j| {
|
||||||
// TODO https://github.com/ziglang/zig/issues/863
|
mem.writeIntLittle(u32, out[4 * j ..][0..4], s);
|
||||||
mem.writeIntSliceLittle(u32, out[4 * j .. 4 * j + 4], s);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,8 +134,7 @@ fn Blake2s(comptime out_len: usize) type {
|
|||||||
var v: [16]u32 = undefined;
|
var v: [16]u32 = undefined;
|
||||||
|
|
||||||
for (m) |*r, i| {
|
for (m) |*r, i| {
|
||||||
// TODO https://github.com/ziglang/zig/issues/863
|
r.* = mem.readIntLittle(u32, b[4 * i ..][0..4]);
|
||||||
r.* = mem.readIntSliceLittle(u32, b[4 * i .. 4 * i + 4]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var k: usize = 0;
|
var k: usize = 0;
|
||||||
@ -358,8 +356,7 @@ fn Blake2b(comptime out_len: usize) type {
|
|||||||
const rr = d.h[0 .. out_len / 64];
|
const rr = d.h[0 .. out_len / 64];
|
||||||
|
|
||||||
for (rr) |s, j| {
|
for (rr) |s, j| {
|
||||||
// TODO https://github.com/ziglang/zig/issues/863
|
mem.writeIntLittle(u64, out[8 * j ..][0..8], s);
|
||||||
mem.writeIntSliceLittle(u64, out[8 * j .. 8 * j + 8], s);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,7 +367,7 @@ fn Blake2b(comptime out_len: usize) type {
|
|||||||
var v: [16]u64 = undefined;
|
var v: [16]u64 = undefined;
|
||||||
|
|
||||||
for (m) |*r, i| {
|
for (m) |*r, i| {
|
||||||
r.* = mem.readIntSliceLittle(u64, b[8 * i .. 8 * i + 8]);
|
r.* = mem.readIntLittle(u64, b[8 * i ..][0..8]);
|
||||||
}
|
}
|
||||||
|
|
||||||
var k: usize = 0;
|
var k: usize = 0;
|
||||||
|
|||||||
@ -61,8 +61,7 @@ fn salsa20_wordtobyte(out: []u8, input: [16]u32) void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (x) |_, i| {
|
for (x) |_, i| {
|
||||||
// TODO https://github.com/ziglang/zig/issues/863
|
mem.writeIntLittle(u32, out[4 * i ..][0..4], x[i] +% input[i]);
|
||||||
mem.writeIntSliceLittle(u32, out[4 * i .. 4 * i + 4], x[i] +% input[i]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,10 +72,10 @@ fn chaCha20_internal(out: []u8, in: []const u8, key: [8]u32, counter: [4]u32) vo
|
|||||||
|
|
||||||
const c = "expand 32-byte k";
|
const c = "expand 32-byte k";
|
||||||
const constant_le = [_]u32{
|
const constant_le = [_]u32{
|
||||||
mem.readIntSliceLittle(u32, c[0..4]),
|
mem.readIntLittle(u32, c[0..4]),
|
||||||
mem.readIntSliceLittle(u32, c[4..8]),
|
mem.readIntLittle(u32, c[4..8]),
|
||||||
mem.readIntSliceLittle(u32, c[8..12]),
|
mem.readIntLittle(u32, c[8..12]),
|
||||||
mem.readIntSliceLittle(u32, c[12..16]),
|
mem.readIntLittle(u32, c[12..16]),
|
||||||
};
|
};
|
||||||
|
|
||||||
mem.copy(u32, ctx[0..], constant_le[0..4]);
|
mem.copy(u32, ctx[0..], constant_le[0..4]);
|
||||||
@ -120,19 +119,19 @@ pub fn chaCha20IETF(out: []u8, in: []const u8, counter: u32, key: [32]u8, nonce:
|
|||||||
var k: [8]u32 = undefined;
|
var k: [8]u32 = undefined;
|
||||||
var c: [4]u32 = undefined;
|
var c: [4]u32 = undefined;
|
||||||
|
|
||||||
k[0] = mem.readIntSliceLittle(u32, key[0..4]);
|
k[0] = mem.readIntLittle(u32, key[0..4]);
|
||||||
k[1] = mem.readIntSliceLittle(u32, key[4..8]);
|
k[1] = mem.readIntLittle(u32, key[4..8]);
|
||||||
k[2] = mem.readIntSliceLittle(u32, key[8..12]);
|
k[2] = mem.readIntLittle(u32, key[8..12]);
|
||||||
k[3] = mem.readIntSliceLittle(u32, key[12..16]);
|
k[3] = mem.readIntLittle(u32, key[12..16]);
|
||||||
k[4] = mem.readIntSliceLittle(u32, key[16..20]);
|
k[4] = mem.readIntLittle(u32, key[16..20]);
|
||||||
k[5] = mem.readIntSliceLittle(u32, key[20..24]);
|
k[5] = mem.readIntLittle(u32, key[20..24]);
|
||||||
k[6] = mem.readIntSliceLittle(u32, key[24..28]);
|
k[6] = mem.readIntLittle(u32, key[24..28]);
|
||||||
k[7] = mem.readIntSliceLittle(u32, key[28..32]);
|
k[7] = mem.readIntLittle(u32, key[28..32]);
|
||||||
|
|
||||||
c[0] = counter;
|
c[0] = counter;
|
||||||
c[1] = mem.readIntSliceLittle(u32, nonce[0..4]);
|
c[1] = mem.readIntLittle(u32, nonce[0..4]);
|
||||||
c[2] = mem.readIntSliceLittle(u32, nonce[4..8]);
|
c[2] = mem.readIntLittle(u32, nonce[4..8]);
|
||||||
c[3] = mem.readIntSliceLittle(u32, nonce[8..12]);
|
c[3] = mem.readIntLittle(u32, nonce[8..12]);
|
||||||
chaCha20_internal(out, in, k, c);
|
chaCha20_internal(out, in, k, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,19 +146,19 @@ pub fn chaCha20With64BitNonce(out: []u8, in: []const u8, counter: u64, key: [32]
|
|||||||
var k: [8]u32 = undefined;
|
var k: [8]u32 = undefined;
|
||||||
var c: [4]u32 = undefined;
|
var c: [4]u32 = undefined;
|
||||||
|
|
||||||
k[0] = mem.readIntSliceLittle(u32, key[0..4]);
|
k[0] = mem.readIntLittle(u32, key[0..4]);
|
||||||
k[1] = mem.readIntSliceLittle(u32, key[4..8]);
|
k[1] = mem.readIntLittle(u32, key[4..8]);
|
||||||
k[2] = mem.readIntSliceLittle(u32, key[8..12]);
|
k[2] = mem.readIntLittle(u32, key[8..12]);
|
||||||
k[3] = mem.readIntSliceLittle(u32, key[12..16]);
|
k[3] = mem.readIntLittle(u32, key[12..16]);
|
||||||
k[4] = mem.readIntSliceLittle(u32, key[16..20]);
|
k[4] = mem.readIntLittle(u32, key[16..20]);
|
||||||
k[5] = mem.readIntSliceLittle(u32, key[20..24]);
|
k[5] = mem.readIntLittle(u32, key[20..24]);
|
||||||
k[6] = mem.readIntSliceLittle(u32, key[24..28]);
|
k[6] = mem.readIntLittle(u32, key[24..28]);
|
||||||
k[7] = mem.readIntSliceLittle(u32, key[28..32]);
|
k[7] = mem.readIntLittle(u32, key[28..32]);
|
||||||
|
|
||||||
c[0] = @truncate(u32, counter);
|
c[0] = @truncate(u32, counter);
|
||||||
c[1] = @truncate(u32, counter >> 32);
|
c[1] = @truncate(u32, counter >> 32);
|
||||||
c[2] = mem.readIntSliceLittle(u32, nonce[0..4]);
|
c[2] = mem.readIntLittle(u32, nonce[0..4]);
|
||||||
c[3] = mem.readIntSliceLittle(u32, nonce[4..8]);
|
c[3] = mem.readIntLittle(u32, nonce[4..8]);
|
||||||
|
|
||||||
const block_size = (1 << 6);
|
const block_size = (1 << 6);
|
||||||
// The full block size is greater than the address space on a 32bit machine
|
// The full block size is greater than the address space on a 32bit machine
|
||||||
@ -463,8 +462,8 @@ pub fn chacha20poly1305Seal(dst: []u8, plaintext: []const u8, data: []const u8,
|
|||||||
mac.update(zeros[0..padding]);
|
mac.update(zeros[0..padding]);
|
||||||
}
|
}
|
||||||
var lens: [16]u8 = undefined;
|
var lens: [16]u8 = undefined;
|
||||||
mem.writeIntSliceLittle(u64, lens[0..8], data.len);
|
mem.writeIntLittle(u64, lens[0..8], data.len);
|
||||||
mem.writeIntSliceLittle(u64, lens[8..16], plaintext.len);
|
mem.writeIntLittle(u64, lens[8..16], plaintext.len);
|
||||||
mac.update(lens[0..]);
|
mac.update(lens[0..]);
|
||||||
mac.final(dst[plaintext.len..]);
|
mac.final(dst[plaintext.len..]);
|
||||||
}
|
}
|
||||||
@ -500,8 +499,8 @@ pub fn chacha20poly1305Open(dst: []u8, msgAndTag: []const u8, data: []const u8,
|
|||||||
mac.update(zeros[0..padding]);
|
mac.update(zeros[0..padding]);
|
||||||
}
|
}
|
||||||
var lens: [16]u8 = undefined;
|
var lens: [16]u8 = undefined;
|
||||||
mem.writeIntSliceLittle(u64, lens[0..8], data.len);
|
mem.writeIntLittle(u64, lens[0..8], data.len);
|
||||||
mem.writeIntSliceLittle(u64, lens[8..16], ciphertext.len);
|
mem.writeIntLittle(u64, lens[8..16], ciphertext.len);
|
||||||
mac.update(lens[0..]);
|
mac.update(lens[0..]);
|
||||||
var computedTag: [16]u8 = undefined;
|
var computedTag: [16]u8 = undefined;
|
||||||
mac.final(computedTag[0..]);
|
mac.final(computedTag[0..]);
|
||||||
|
|||||||
@ -112,8 +112,7 @@ pub const Md5 = struct {
|
|||||||
d.round(d.buf[0..]);
|
d.round(d.buf[0..]);
|
||||||
|
|
||||||
for (d.s) |s, j| {
|
for (d.s) |s, j| {
|
||||||
// TODO https://github.com/ziglang/zig/issues/863
|
mem.writeIntLittle(u32, out[4 * j ..][0..4], s);
|
||||||
mem.writeIntSliceLittle(u32, out[4 * j .. 4 * j + 4], s);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -3,11 +3,11 @@
|
|||||||
// https://monocypher.org/
|
// https://monocypher.org/
|
||||||
|
|
||||||
const std = @import("../std.zig");
|
const std = @import("../std.zig");
|
||||||
const builtin = @import("builtin");
|
const builtin = std.builtin;
|
||||||
|
|
||||||
const Endian = builtin.Endian;
|
const Endian = builtin.Endian;
|
||||||
const readIntSliceLittle = std.mem.readIntSliceLittle;
|
const readIntLittle = std.mem.readIntLittle;
|
||||||
const writeIntSliceLittle = std.mem.writeIntSliceLittle;
|
const writeIntLittle = std.mem.writeIntLittle;
|
||||||
|
|
||||||
pub const Poly1305 = struct {
|
pub const Poly1305 = struct {
|
||||||
const Self = @This();
|
const Self = @This();
|
||||||
@ -59,19 +59,19 @@ pub const Poly1305 = struct {
|
|||||||
{
|
{
|
||||||
var i: usize = 0;
|
var i: usize = 0;
|
||||||
while (i < 1) : (i += 1) {
|
while (i < 1) : (i += 1) {
|
||||||
ctx.r[0] = readIntSliceLittle(u32, key[0..4]) & 0x0fffffff;
|
ctx.r[0] = readIntLittle(u32, key[0..4]) & 0x0fffffff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
var i: usize = 1;
|
var i: usize = 1;
|
||||||
while (i < 4) : (i += 1) {
|
while (i < 4) : (i += 1) {
|
||||||
ctx.r[i] = readIntSliceLittle(u32, key[i * 4 .. i * 4 + 4]) & 0x0ffffffc;
|
ctx.r[i] = readIntLittle(u32, key[i * 4 ..][0..4]) & 0x0ffffffc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
var i: usize = 0;
|
var i: usize = 0;
|
||||||
while (i < 4) : (i += 1) {
|
while (i < 4) : (i += 1) {
|
||||||
ctx.pad[i] = readIntSliceLittle(u32, key[i * 4 + 16 .. i * 4 + 16 + 4]);
|
ctx.pad[i] = readIntLittle(u32, key[i * 4 + 16 ..][0..4]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,10 +168,10 @@ pub const Poly1305 = struct {
|
|||||||
const nb_blocks = nmsg.len >> 4;
|
const nb_blocks = nmsg.len >> 4;
|
||||||
var i: usize = 0;
|
var i: usize = 0;
|
||||||
while (i < nb_blocks) : (i += 1) {
|
while (i < nb_blocks) : (i += 1) {
|
||||||
ctx.c[0] = readIntSliceLittle(u32, nmsg[0..4]);
|
ctx.c[0] = readIntLittle(u32, nmsg[0..4]);
|
||||||
ctx.c[1] = readIntSliceLittle(u32, nmsg[4..8]);
|
ctx.c[1] = readIntLittle(u32, nmsg[4..8]);
|
||||||
ctx.c[2] = readIntSliceLittle(u32, nmsg[8..12]);
|
ctx.c[2] = readIntLittle(u32, nmsg[8..12]);
|
||||||
ctx.c[3] = readIntSliceLittle(u32, nmsg[12..16]);
|
ctx.c[3] = readIntLittle(u32, nmsg[12..16]);
|
||||||
polyBlock(ctx);
|
polyBlock(ctx);
|
||||||
nmsg = nmsg[16..];
|
nmsg = nmsg[16..];
|
||||||
}
|
}
|
||||||
@ -210,11 +210,10 @@ pub const Poly1305 = struct {
|
|||||||
const uu2 = (uu1 >> 32) + ctx.h[2] + ctx.pad[2]; // <= 2_00000000
|
const uu2 = (uu1 >> 32) + ctx.h[2] + ctx.pad[2]; // <= 2_00000000
|
||||||
const uu3 = (uu2 >> 32) + ctx.h[3] + ctx.pad[3]; // <= 2_00000000
|
const uu3 = (uu2 >> 32) + ctx.h[3] + ctx.pad[3]; // <= 2_00000000
|
||||||
|
|
||||||
// TODO https://github.com/ziglang/zig/issues/863
|
writeIntLittle(u32, out[0..4], @truncate(u32, uu0));
|
||||||
writeIntSliceLittle(u32, out[0..], @truncate(u32, uu0));
|
writeIntLittle(u32, out[4..8], @truncate(u32, uu1));
|
||||||
writeIntSliceLittle(u32, out[4..], @truncate(u32, uu1));
|
writeIntLittle(u32, out[8..12], @truncate(u32, uu2));
|
||||||
writeIntSliceLittle(u32, out[8..], @truncate(u32, uu2));
|
writeIntLittle(u32, out[12..16], @truncate(u32, uu3));
|
||||||
writeIntSliceLittle(u32, out[12..], @truncate(u32, uu3));
|
|
||||||
|
|
||||||
ctx.secureZero();
|
ctx.secureZero();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -109,8 +109,7 @@ pub const Sha1 = struct {
|
|||||||
d.round(d.buf[0..]);
|
d.round(d.buf[0..]);
|
||||||
|
|
||||||
for (d.s) |s, j| {
|
for (d.s) |s, j| {
|
||||||
// TODO https://github.com/ziglang/zig/issues/863
|
mem.writeIntBig(u32, out[4 * j ..][0..4], s);
|
||||||
mem.writeIntSliceBig(u32, out[4 * j .. 4 * j + 4], s);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -120,7 +120,7 @@ fn keccak_f(comptime F: usize, d: []u8) void {
|
|||||||
var c = [_]u64{0} ** 5;
|
var c = [_]u64{0} ** 5;
|
||||||
|
|
||||||
for (s) |*r, i| {
|
for (s) |*r, i| {
|
||||||
r.* = mem.readIntSliceLittle(u64, d[8 * i .. 8 * i + 8]);
|
r.* = mem.readIntLittle(u64, d[8 * i ..][0..8]);
|
||||||
}
|
}
|
||||||
|
|
||||||
comptime var x: usize = 0;
|
comptime var x: usize = 0;
|
||||||
@ -167,8 +167,7 @@ fn keccak_f(comptime F: usize, d: []u8) void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (s) |r, i| {
|
for (s) |r, i| {
|
||||||
// TODO https://github.com/ziglang/zig/issues/863
|
mem.writeIntLittle(u64, d[8 * i ..][0..8], r);
|
||||||
mem.writeIntSliceLittle(u64, d[8 * i .. 8 * i + 8], r);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,8 +7,8 @@ const builtin = @import("builtin");
|
|||||||
const fmt = std.fmt;
|
const fmt = std.fmt;
|
||||||
|
|
||||||
const Endian = builtin.Endian;
|
const Endian = builtin.Endian;
|
||||||
const readIntSliceLittle = std.mem.readIntSliceLittle;
|
const readIntLittle = std.mem.readIntLittle;
|
||||||
const writeIntSliceLittle = std.mem.writeIntSliceLittle;
|
const writeIntLittle = std.mem.writeIntLittle;
|
||||||
|
|
||||||
// Based on Supercop's ref10 implementation.
|
// Based on Supercop's ref10 implementation.
|
||||||
pub const X25519 = struct {
|
pub const X25519 = struct {
|
||||||
@ -255,16 +255,16 @@ const Fe = struct {
|
|||||||
|
|
||||||
var t: [10]i64 = undefined;
|
var t: [10]i64 = undefined;
|
||||||
|
|
||||||
t[0] = readIntSliceLittle(u32, s[0..4]);
|
t[0] = readIntLittle(u32, s[0..4]);
|
||||||
t[1] = @as(u32, readIntSliceLittle(u24, s[4..7])) << 6;
|
t[1] = @as(u32, readIntLittle(u24, s[4..7])) << 6;
|
||||||
t[2] = @as(u32, readIntSliceLittle(u24, s[7..10])) << 5;
|
t[2] = @as(u32, readIntLittle(u24, s[7..10])) << 5;
|
||||||
t[3] = @as(u32, readIntSliceLittle(u24, s[10..13])) << 3;
|
t[3] = @as(u32, readIntLittle(u24, s[10..13])) << 3;
|
||||||
t[4] = @as(u32, readIntSliceLittle(u24, s[13..16])) << 2;
|
t[4] = @as(u32, readIntLittle(u24, s[13..16])) << 2;
|
||||||
t[5] = readIntSliceLittle(u32, s[16..20]);
|
t[5] = readIntLittle(u32, s[16..20]);
|
||||||
t[6] = @as(u32, readIntSliceLittle(u24, s[20..23])) << 7;
|
t[6] = @as(u32, readIntLittle(u24, s[20..23])) << 7;
|
||||||
t[7] = @as(u32, readIntSliceLittle(u24, s[23..26])) << 5;
|
t[7] = @as(u32, readIntLittle(u24, s[23..26])) << 5;
|
||||||
t[8] = @as(u32, readIntSliceLittle(u24, s[26..29])) << 4;
|
t[8] = @as(u32, readIntLittle(u24, s[26..29])) << 4;
|
||||||
t[9] = (@as(u32, readIntSliceLittle(u24, s[29..32])) & 0x7fffff) << 2;
|
t[9] = (@as(u32, readIntLittle(u24, s[29..32])) & 0x7fffff) << 2;
|
||||||
|
|
||||||
carry1(h, t[0..]);
|
carry1(h, t[0..]);
|
||||||
}
|
}
|
||||||
@ -544,15 +544,14 @@ const Fe = struct {
|
|||||||
ut[i] = @bitCast(u32, @intCast(i32, t[i]));
|
ut[i] = @bitCast(u32, @intCast(i32, t[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO https://github.com/ziglang/zig/issues/863
|
writeIntLittle(u32, s[0..4], (ut[0] >> 0) | (ut[1] << 26));
|
||||||
writeIntSliceLittle(u32, s[0..4], (ut[0] >> 0) | (ut[1] << 26));
|
writeIntLittle(u32, s[4..8], (ut[1] >> 6) | (ut[2] << 19));
|
||||||
writeIntSliceLittle(u32, s[4..8], (ut[1] >> 6) | (ut[2] << 19));
|
writeIntLittle(u32, s[8..12], (ut[2] >> 13) | (ut[3] << 13));
|
||||||
writeIntSliceLittle(u32, s[8..12], (ut[2] >> 13) | (ut[3] << 13));
|
writeIntLittle(u32, s[12..16], (ut[3] >> 19) | (ut[4] << 6));
|
||||||
writeIntSliceLittle(u32, s[12..16], (ut[3] >> 19) | (ut[4] << 6));
|
writeIntLittle(u32, s[16..20], (ut[5] >> 0) | (ut[6] << 25));
|
||||||
writeIntSliceLittle(u32, s[16..20], (ut[5] >> 0) | (ut[6] << 25));
|
writeIntLittle(u32, s[20..24], (ut[6] >> 7) | (ut[7] << 19));
|
||||||
writeIntSliceLittle(u32, s[20..24], (ut[6] >> 7) | (ut[7] << 19));
|
writeIntLittle(u32, s[24..28], (ut[7] >> 13) | (ut[8] << 12));
|
||||||
writeIntSliceLittle(u32, s[24..28], (ut[7] >> 13) | (ut[8] << 12));
|
writeIntLittle(u32, s[28..32], (ut[8] >> 20) | (ut[9] << 6));
|
||||||
writeIntSliceLittle(u32, s[28..], (ut[8] >> 20) | (ut[9] << 6));
|
|
||||||
|
|
||||||
std.mem.secureZero(i64, t[0..]);
|
std.mem.secureZero(i64, t[0..]);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,8 +39,8 @@ fn SipHashStateless(comptime T: type, comptime c_rounds: usize, comptime d_round
|
|||||||
pub fn init(key: []const u8) Self {
|
pub fn init(key: []const u8) Self {
|
||||||
assert(key.len >= 16);
|
assert(key.len >= 16);
|
||||||
|
|
||||||
const k0 = mem.readIntSliceLittle(u64, key[0..8]);
|
const k0 = mem.readIntLittle(u64, key[0..8]);
|
||||||
const k1 = mem.readIntSliceLittle(u64, key[8..16]);
|
const k1 = mem.readIntLittle(u64, key[8..16]);
|
||||||
|
|
||||||
var d = Self{
|
var d = Self{
|
||||||
.v0 = k0 ^ 0x736f6d6570736575,
|
.v0 = k0 ^ 0x736f6d6570736575,
|
||||||
@ -111,7 +111,7 @@ fn SipHashStateless(comptime T: type, comptime c_rounds: usize, comptime d_round
|
|||||||
fn round(self: *Self, b: []const u8) void {
|
fn round(self: *Self, b: []const u8) void {
|
||||||
assert(b.len == 8);
|
assert(b.len == 8);
|
||||||
|
|
||||||
const m = mem.readIntSliceLittle(u64, b[0..]);
|
const m = mem.readIntLittle(u64, b[0..8]);
|
||||||
self.v3 ^= m;
|
self.v3 ^= m;
|
||||||
|
|
||||||
// TODO this is a workaround, should be able to supply the value without a separate variable
|
// TODO this is a workaround, should be able to supply the value without a separate variable
|
||||||
|
|||||||
@ -11,7 +11,7 @@ const primes = [_]u64{
|
|||||||
|
|
||||||
fn read_bytes(comptime bytes: u8, data: []const u8) u64 {
|
fn read_bytes(comptime bytes: u8, data: []const u8) u64 {
|
||||||
const T = std.meta.IntType(false, 8 * bytes);
|
const T = std.meta.IntType(false, 8 * bytes);
|
||||||
return mem.readIntSliceLittle(T, data[0..bytes]);
|
return mem.readIntLittle(T, data[0..bytes]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_8bytes_swapped(data: []const u8) u64 {
|
fn read_8bytes_swapped(data: []const u8) u64 {
|
||||||
|
|||||||
@ -824,8 +824,7 @@ pub const readIntBig = switch (builtin.endian) {
|
|||||||
pub fn readIntSliceNative(comptime T: type, bytes: []const u8) T {
|
pub fn readIntSliceNative(comptime T: type, bytes: []const u8) T {
|
||||||
const n = @divExact(T.bit_count, 8);
|
const n = @divExact(T.bit_count, 8);
|
||||||
assert(bytes.len >= n);
|
assert(bytes.len >= n);
|
||||||
// TODO https://github.com/ziglang/zig/issues/863
|
return readIntNative(T, bytes[0..n]);
|
||||||
return readIntNative(T, @ptrCast(*const [n]u8, bytes.ptr));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Asserts that bytes.len >= T.bit_count / 8. Reads the integer starting from index 0
|
/// Asserts that bytes.len >= T.bit_count / 8. Reads the integer starting from index 0
|
||||||
@ -863,8 +862,7 @@ pub fn readInt(comptime T: type, bytes: *const [@divExact(T.bit_count, 8)]u8, en
|
|||||||
pub fn readIntSlice(comptime T: type, bytes: []const u8, endian: builtin.Endian) T {
|
pub fn readIntSlice(comptime T: type, bytes: []const u8, endian: builtin.Endian) T {
|
||||||
const n = @divExact(T.bit_count, 8);
|
const n = @divExact(T.bit_count, 8);
|
||||||
assert(bytes.len >= n);
|
assert(bytes.len >= n);
|
||||||
// TODO https://github.com/ziglang/zig/issues/863
|
return readInt(T, bytes[0..n], endian);
|
||||||
return readInt(T, @ptrCast(*const [n]u8, bytes.ptr), endian);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
test "comptime read/write int" {
|
test "comptime read/write int" {
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
// ```
|
// ```
|
||||||
// var buf: [8]u8 = undefined;
|
// var buf: [8]u8 = undefined;
|
||||||
// try std.crypto.randomBytes(buf[0..]);
|
// try std.crypto.randomBytes(buf[0..]);
|
||||||
// const seed = mem.readIntSliceLittle(u64, buf[0..8]);
|
// const seed = mem.readIntLittle(u64, buf[0..8]);
|
||||||
//
|
//
|
||||||
// var r = DefaultPrng.init(seed);
|
// var r = DefaultPrng.init(seed);
|
||||||
//
|
//
|
||||||
|
|||||||
@ -251,12 +251,12 @@ pub const Utf16LeIterator = struct {
|
|||||||
pub fn nextCodepoint(it: *Utf16LeIterator) !?u21 {
|
pub fn nextCodepoint(it: *Utf16LeIterator) !?u21 {
|
||||||
assert(it.i <= it.bytes.len);
|
assert(it.i <= it.bytes.len);
|
||||||
if (it.i == it.bytes.len) return null;
|
if (it.i == it.bytes.len) return null;
|
||||||
const c0: u21 = mem.readIntSliceLittle(u16, it.bytes[it.i .. it.i + 2]);
|
const c0: u21 = mem.readIntLittle(u16, it.bytes[it.i..][0..2]);
|
||||||
if (c0 & ~@as(u21, 0x03ff) == 0xd800) {
|
if (c0 & ~@as(u21, 0x03ff) == 0xd800) {
|
||||||
// surrogate pair
|
// surrogate pair
|
||||||
it.i += 2;
|
it.i += 2;
|
||||||
if (it.i >= it.bytes.len) return error.DanglingSurrogateHalf;
|
if (it.i >= it.bytes.len) return error.DanglingSurrogateHalf;
|
||||||
const c1: u21 = mem.readIntSliceLittle(u16, it.bytes[it.i .. it.i + 2]);
|
const c1: u21 = mem.readIntLittle(u16, it.bytes[it.i..][0..2]);
|
||||||
if (c1 & ~@as(u21, 0x03ff) != 0xdc00) return error.ExpectedSecondSurrogateHalf;
|
if (c1 & ~@as(u21, 0x03ff) != 0xdc00) return error.ExpectedSecondSurrogateHalf;
|
||||||
it.i += 2;
|
it.i += 2;
|
||||||
return 0x10000 + (((c0 & 0x03ff) << 10) | (c1 & 0x03ff));
|
return 0x10000 + (((c0 & 0x03ff) << 10) | (c1 & 0x03ff));
|
||||||
@ -631,10 +631,10 @@ test "utf8ToUtf16LeWithNull" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Converts a UTF-8 string literal into a UTF-16LE string literal.
|
/// Converts a UTF-8 string literal into a UTF-16LE string literal.
|
||||||
pub fn utf8ToUtf16LeStringLiteral(comptime utf8: []const u8) *const [calcUtf16LeLen(utf8) :0] u16 {
|
pub fn utf8ToUtf16LeStringLiteral(comptime utf8: []const u8) *const [calcUtf16LeLen(utf8):0]u16 {
|
||||||
comptime {
|
comptime {
|
||||||
const len: usize = calcUtf16LeLen(utf8);
|
const len: usize = calcUtf16LeLen(utf8);
|
||||||
var utf16le: [len :0]u16 = [_ :0]u16{0} ** len;
|
var utf16le: [len:0]u16 = [_:0]u16{0} ** len;
|
||||||
const utf16le_len = utf8ToUtf16Le(&utf16le, utf8[0..]) catch |err| @compileError(err);
|
const utf16le_len = utf8ToUtf16Le(&utf16le, utf8[0..]) catch |err| @compileError(err);
|
||||||
assert(len == utf16le_len);
|
assert(len == utf16le_len);
|
||||||
return &utf16le;
|
return &utf16le;
|
||||||
@ -660,8 +660,8 @@ fn calcUtf16LeLen(utf8: []const u8) usize {
|
|||||||
}
|
}
|
||||||
|
|
||||||
test "utf8ToUtf16LeStringLiteral" {
|
test "utf8ToUtf16LeStringLiteral" {
|
||||||
{
|
{
|
||||||
const bytes = [_:0]u16{ 0x41 };
|
const bytes = [_:0]u16{0x41};
|
||||||
const utf16 = utf8ToUtf16LeStringLiteral("A");
|
const utf16 = utf8ToUtf16LeStringLiteral("A");
|
||||||
testing.expectEqualSlices(u16, &bytes, utf16);
|
testing.expectEqualSlices(u16, &bytes, utf16);
|
||||||
testing.expect(utf16[1] == 0);
|
testing.expect(utf16[1] == 0);
|
||||||
@ -673,19 +673,19 @@ test "utf8ToUtf16LeStringLiteral" {
|
|||||||
testing.expect(utf16[2] == 0);
|
testing.expect(utf16[2] == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const bytes = [_:0]u16{ 0x02FF };
|
const bytes = [_:0]u16{0x02FF};
|
||||||
const utf16 = utf8ToUtf16LeStringLiteral("\u{02FF}");
|
const utf16 = utf8ToUtf16LeStringLiteral("\u{02FF}");
|
||||||
testing.expectEqualSlices(u16, &bytes, utf16);
|
testing.expectEqualSlices(u16, &bytes, utf16);
|
||||||
testing.expect(utf16[1] == 0);
|
testing.expect(utf16[1] == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const bytes = [_:0]u16{ 0x7FF };
|
const bytes = [_:0]u16{0x7FF};
|
||||||
const utf16 = utf8ToUtf16LeStringLiteral("\u{7FF}");
|
const utf16 = utf8ToUtf16LeStringLiteral("\u{7FF}");
|
||||||
testing.expectEqualSlices(u16, &bytes, utf16);
|
testing.expectEqualSlices(u16, &bytes, utf16);
|
||||||
testing.expect(utf16[1] == 0);
|
testing.expect(utf16[1] == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const bytes = [_:0]u16{ 0x801 };
|
const bytes = [_:0]u16{0x801};
|
||||||
const utf16 = utf8ToUtf16LeStringLiteral("\u{801}");
|
const utf16 = utf8ToUtf16LeStringLiteral("\u{801}");
|
||||||
testing.expectEqualSlices(u16, &bytes, utf16);
|
testing.expectEqualSlices(u16, &bytes, utf16);
|
||||||
testing.expect(utf16[1] == 0);
|
testing.expect(utf16[1] == 0);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user