structstd.crypto.asn1.BitString[src]

Fields

right_padding: u3 = 0

Number of bits in rightmost byte that are unused.

bytes: []const u8

Functions

FunctionbitLen[src]

pub fn bitLen(self: BitString) usize

Parameters

self: BitString

Source Code

Source code
pub fn bitLen(self: BitString) usize {
    return self.bytes.len * 8 - self.right_padding;
}

FunctiondecodeDer[src]

pub fn decodeDer(decoder: *der.Decoder) !BitString

Parameters

decoder: *der.Decoder

Source Code

Source code
pub fn decodeDer(decoder: *der.Decoder) !BitString {
    const ele = try decoder.element(asn1_tag.toExpected());
    const bytes = decoder.view(ele);

    if (bytes.len < 1) return error.InvalidBitString;
    const padding = bytes[0];
    if (padding >= 8) return error.InvalidBitString;
    const right_padding: u3 = @intCast(padding);

    // DER requires that unused bits be zero.
    if (@ctz(bytes[bytes.len - 1]) < right_padding) return error.InvalidBitString;

    return BitString{ .bytes = bytes[1..], .right_padding = right_padding };
}

FunctionencodeDer[src]

pub fn encodeDer(self: BitString, encoder: *der.Encoder) !void

Parameters

self: BitString
encoder: *der.Encoder

Source Code

Source code
pub fn encodeDer(self: BitString, encoder: *der.Encoder) !void {
    try encoder.writer().writeAll(self.bytes);
    try encoder.writer().writeByte(self.right_padding);
    try encoder.length(self.bytes.len + 1);
    try encoder.tag(asn1_tag);
}

Source Code

Source code
pub const BitString = struct {
    /// Number of bits in rightmost byte that are unused.
    right_padding: u3 = 0,
    bytes: []const u8,

    pub fn bitLen(self: BitString) usize {
        return self.bytes.len * 8 - self.right_padding;
    }

    const asn1_tag = Tag.universal(.bitstring, false);

    pub fn decodeDer(decoder: *der.Decoder) !BitString {
        const ele = try decoder.element(asn1_tag.toExpected());
        const bytes = decoder.view(ele);

        if (bytes.len < 1) return error.InvalidBitString;
        const padding = bytes[0];
        if (padding >= 8) return error.InvalidBitString;
        const right_padding: u3 = @intCast(padding);

        // DER requires that unused bits be zero.
        if (@ctz(bytes[bytes.len - 1]) < right_padding) return error.InvalidBitString;

        return BitString{ .bytes = bytes[1..], .right_padding = right_padding };
    }

    pub fn encodeDer(self: BitString, encoder: *der.Encoder) !void {
        try encoder.writer().writeAll(self.bytes);
        try encoder.writer().writeByte(self.right_padding);
        try encoder.length(self.bytes.len + 1);
        try encoder.tag(asn1_tag);
    }
}