enumstd.crypto.sha3.NistLengthEncoding[src]

The NIST SP 800-185 encoded length format.

Fields

left
right

Functions

Functionencode[src]

pub fn encode(comptime encoding: NistLengthEncoding, len: usize) Length

Encode a length according to NIST SP 800-185.

Parameters

len: usize

Source Code

Source code
pub fn encode(comptime encoding: NistLengthEncoding, len: usize) Length {
    const len_bits = @bitSizeOf(@TypeOf(len)) - @clz(len) + 3;
    const len_bytes = std.math.divCeil(usize, len_bits, 8) catch unreachable;

    var res = Length{ .len = len_bytes + 1 };
    if (encoding == .right) {
        res.buf[len_bytes] = @intCast(len_bytes);
    }
    const end = if (encoding == .right) len_bytes - 1 else len_bytes;
    res.buf[end] = @truncate(len << 3);
    var len_ = len >> 5;
    for (1..len_bytes) |i| {
        res.buf[end - i] = @truncate(len_);
        len_ >>= 8;
    }
    if (encoding == .left) {
        res.buf[0] = @intCast(len_bytes);
    }
    return res;
}

Source Code

Source code
pub const NistLengthEncoding = enum {
    left,
    right,

    /// A length encoded according to NIST SP 800-185.
    pub const Length = struct {
        /// The size of the encoded value, in bytes.
        len: usize = 0,
        /// A buffer to store the encoded length.
        buf: [@sizeOf(usize) + 1]u8 = undefined,

        /// Return the encoded length as a slice.
        pub fn slice(self: *const Length) []const u8 {
            return self.buf[0..self.len];
        }
    };

    /// Encode a length according to NIST SP 800-185.
    pub fn encode(comptime encoding: NistLengthEncoding, len: usize) Length {
        const len_bits = @bitSizeOf(@TypeOf(len)) - @clz(len) + 3;
        const len_bytes = std.math.divCeil(usize, len_bits, 8) catch unreachable;

        var res = Length{ .len = len_bytes + 1 };
        if (encoding == .right) {
            res.buf[len_bytes] = @intCast(len_bytes);
        }
        const end = if (encoding == .right) len_bytes - 1 else len_bytes;
        res.buf[end] = @truncate(len << 3);
        var len_ = len >> 5;
        for (1..len_bytes) |i| {
            res.buf[end - i] = @truncate(len_);
            len_ >>= 8;
        }
        if (encoding == .left) {
            res.buf[0] = @intCast(len_bytes);
        }
        return res;
    }
}