tiny.quic.tls.message
Defined in tls.
API (43)
Actions
Public operations.
CertificateEntries.iteratorCertificateIterator.nextExtensionIterator.nextExtensions.iteratordecodedecodeCertificatedecodeCertificateRequestdecodeCertificateVerifydecodeClientHellodecodeEncryptedExtensionsdecodeFinisheddecodeNewSessionTicketdecodeServerHelloencodeencodeCertificateencodeCertificateRequestencodeCertificateVerifyencodeClientHelloencodeEncryptedExtensionsencodeFinishedencodeServerHelloencodeSingleCertificatefindExtension
Types and contracts
Public types and contracts.
CertificateCertificateEntriesCertificateEntryCertificateIteratorCertificateRequestCertificateVerifyClientHelloDecodeErrorEncodeErrorEncryptedExtensionsExtensionExtensionIteratorExtensionsFinishedHandshakeNewSessionTicketServerHello
Namespaces
Public namespaces.
Values and defaults
Public values and defaults.
Source
Source: lib/quic/src/tls/message/codec.zig:81
pub const Certificate = struct { request_context: []const u8, entries: CertificateEntries,};Source: lib/quic/src/tls/message/codec.zig:91
pub const CertificateEntries = struct { bytes: []const u8, pub fn iterator(self: CertificateEntries) CertificateIterator { return .{ .input = cursor.Read.init(self.bytes), .count = 0 }; }};Source: lib/quic/src/tls/message/codec.zig:86
pub const CertificateEntry = struct { data: []const u8, extensions: Extensions,};Source: lib/quic/src/tls/message/codec.zig:99
pub const CertificateIterator = struct { input: cursor.Read, count: u8, pub fn next(self: *CertificateIterator) DecodeError!?CertificateEntry { if (self.input.remaining() == 0) return null; if (self.count == certificate_entries_max) { return error.TooManyCertificateEntries; } self.count += 1; const data = try takeVector24(&self.input); const extensions = try takeVector16(&self.input); return .{ .data = data, .extensions = .{ .bytes = extensions } }; }};Source: lib/quic/src/tls/message/codec.zig:76
pub const CertificateRequest = struct { context: []const u8, extensions: Extensions,};Source: lib/quic/src/tls/message/codec.zig:115
pub const CertificateVerify = struct { algorithm: std.crypto.tls.SignatureScheme, signature: []const u8,};Source: lib/quic/src/tls/message/codec.zig:56
pub const ClientHello = struct { legacy_version: u16, random: [32]u8, legacy_session_id: []const u8, cipher_suites: []const u8, compression_methods: []const u8, extensions: Extensions,};Source: lib/quic/src/tls/message/codec.zig:74
pub const EncryptedExtensions = struct { extensions: Extensions };Source: lib/quic/src/tls/message/codec.zig:29
pub const Extension = struct { kind: ExtensionType, data: []const u8,};Source: lib/quic/src/tls/message/codec.zig:42
pub const ExtensionIterator = struct { input: cursor.Read, count: u8, pub fn next(self: *ExtensionIterator) DecodeError!?Extension { if (self.input.remaining() == 0) return null; if (self.count == extension_count_max) return error.TooManyExtensions; self.count += 1; const kind: ExtensionType = @fromBackingInt(@intCast(try self.input.int(u16))); const length = try self.input.int(u16); return .{ .kind = kind, .data = try self.input.take(length) }; }};Source: lib/quic/src/tls/message/codec.zig:34
pub const Extensions = struct { bytes: []const u8, pub fn iterator(self: Extensions) ExtensionIterator { return .{ .input = cursor.Read.init(self.bytes), .count = 0 }; }};Source: lib/quic/src/tls/message/codec.zig:120
pub const Finished = struct { verify_data: []const u8 };Source: lib/quic/src/tls/message/codec.zig:24
pub const Handshake = struct { kind: HandshakeType, body: []const u8,};Source: lib/quic/src/tls/message/codec.zig:122
pub const NewSessionTicket = struct { lifetime: u32, age_add: u32, nonce: []const u8, ticket: []const u8, extensions: Extensions,};Source: lib/quic/src/tls/message/codec.zig:65
pub const ServerHello = struct { legacy_version: u16, random: [32]u8, legacy_session_id_echo: []const u8, cipher_suite: u16, compression_method: u8, extensions: Extensions,};Source: lib/quic/src/tls/message/codec.zig:21
Source: lib/quic/src/tls/message/codec.zig:9
pub const certificate_entries_max: u8 = 8;Source: lib/quic/src/tls/message/codec.zig:130
pub fn decode(bytes: []const u8) DecodeError!Handshake { var input = cursor.Read.init(bytes); const kind: HandshakeType = @fromBackingInt(@intCast(try input.byte())); const length = try input.int(u24); const body = try input.take(length); if (input.remaining() != 0) return error.InvalidLength; return .{ .kind = kind, .body = body };}Source: lib/quic/src/tls/message/codec.zig:298
pub fn decodeCertificate(bytes: []const u8) DecodeError!Certificate { var input = try expected(bytes, .certificate); const context = try takeVector8(&input); const entries = try takeVector24(&input); try finish(&input); return .{ .request_context = context, .entries = .{ .bytes = entries } };}Source: lib/quic/src/tls/message/codec.zig:278
pub fn decodeCertificateRequest(bytes: []const u8) DecodeError!CertificateRequest { var input = try expected(bytes, .certificate_request); const context = try takeVector8(&input); const extensions = try takeVector16(&input); try finish(&input); return .{ .context = context, .extensions = .{ .bytes = extensions } };}Source: lib/quic/src/tls/message/codec.zig:332
pub fn decodeCertificateVerify(bytes: []const u8) DecodeError!CertificateVerify { var input = try expected(bytes, .certificate_verify); const algorithm: std.crypto.tls.SignatureScheme = @fromBackingInt(@intCast(try input.int(u16))); const signature = try takeVector16(&input); try finish(&input); return .{ .algorithm = algorithm, .signature = signature };}Source: lib/quic/src/tls/message/codec.zig:181
pub fn decodeClientHello(bytes: []const u8) DecodeError!ClientHello { var input = try expected(bytes, .client_hello); const legacy_version = try input.int(u16); var random: [32]u8 = undefined; @memcpy(&random, try input.take(32)); const session_id = try takeVector8(&input); const cipher_suites = try takeVector16(&input); if (cipher_suites.len == 0) return error.InvalidLength; if (cipher_suites.len % 2 != 0) return error.InvalidLength; const compression = try takeVector8(&input); const extensions = try takeVector16(&input); try finish(&input); return .{ .legacy_version = legacy_version, .random = random, .legacy_session_id = session_id, .cipher_suites = cipher_suites, .compression_methods = compression, .extensions = .{ .bytes = extensions }, };}Source: lib/quic/src/tls/message/codec.zig:262
pub fn decodeEncryptedExtensions(bytes: []const u8) DecodeError!EncryptedExtensions { var input = try expected(bytes, .encrypted_extensions); const extensions = try takeVector16(&input); try finish(&input); return .{ .extensions = .{ .bytes = extensions } };}Source: lib/quic/src/tls/message/codec.zig:369
pub fn decodeFinished(bytes: []const u8) DecodeError!Finished { const value = try decode(bytes); if (value.kind != .finished) return error.WrongMessage; return .{ .verify_data = value.body };}Source: lib/quic/src/tls/message/codec.zig:350
pub fn decodeNewSessionTicket(bytes: []const u8) DecodeError!NewSessionTicket { var input = try expected(bytes, .new_session_ticket); const lifetime = try input.int(u32); const age_add = try input.int(u32); const nonce = try takeVector8(&input); const ticket = try takeVector16(&input); if (ticket.len == 0) return error.InvalidLength; const extensions = try takeVector16(&input); if (extensions.len > std.math.maxInt(u16) - 1) return error.InvalidLength; try finish(&input); return .{ .lifetime = lifetime, .age_add = age_add, .nonce = nonce, .ticket = ticket, .extensions = .{ .bytes = extensions }, };}Source: lib/quic/src/tls/message/codec.zig:229
pub fn decodeServerHello(bytes: []const u8) DecodeError!ServerHello { var input = try expected(bytes, .server_hello); const legacy_version = try input.int(u16); var random: [32]u8 = undefined; @memcpy(&random, try input.take(32)); const session_id = try takeVector8(&input); const cipher_suite = try input.int(u16); const compression_method = try input.byte(); const extensions = try takeVector16(&input); try finish(&input); return .{ .legacy_version = legacy_version, .random = random, .legacy_session_id_echo = session_id, .cipher_suite = cipher_suite, .compression_method = compression_method, .extensions = .{ .bytes = extensions }, };}Source: lib/quic/src/tls/message/codec.zig:139
pub fn encode(value: Handshake, output: *cursor.Write) EncodeError!void { try writeHeader(value.kind, value.body.len, output); try output.put(value.body);}Source: lib/quic/src/tls/message/codec.zig:306
pub fn encodeCertificate(value: Certificate, output: *cursor.Write) EncodeError!void { var length = try addLength(1, value.request_context.len); length = try addLength(length, 3); length = try addLength(length, value.entries.bytes.len); try writeHeader(.certificate, length, output); try writeVector8(value.request_context, output); try writeVector24(value.entries.bytes, output);}Source: lib/quic/src/tls/message/codec.zig:286
pub fn encodeCertificateRequest( value: CertificateRequest, output: *cursor.Write,) EncodeError!void { var length = try addLength(1, value.context.len); length = try addLength(length, 2); length = try addLength(length, value.extensions.bytes.len); try writeHeader(.certificate_request, length, output); try writeVector8(value.context, output); try writeVector16(value.extensions.bytes, output);}Source: lib/quic/src/tls/message/codec.zig:340
pub fn encodeCertificateVerify( value: CertificateVerify, output: *cursor.Write,) EncodeError!void { const length = try addLength(4, value.signature.len); try writeHeader(.certificate_verify, length, output); try output.int(u16, @backingInt(value.algorithm)); try writeVector16(value.signature, output);}Source: lib/quic/src/tls/message/codec.zig:203
pub fn encodeClientHello(value: ClientHello, output: *cursor.Write) EncodeError!void { if (value.cipher_suites.len == 0) return error.InvalidLength; if (value.cipher_suites.len % 2 != 0) return error.InvalidLength; const length = try helloLength( value.legacy_session_id.len, value.cipher_suites.len, value.compression_methods.len, value.extensions.bytes.len, ); try writeHeader(.client_hello, length, output); try output.int(u16, value.legacy_version); try output.put(&value.random); try writeVector8(value.legacy_session_id, output); try writeVector16(value.cipher_suites, output); try writeVector8(value.compression_methods, output); try writeVector16(value.extensions.bytes, output);}Source: lib/quic/src/tls/message/codec.zig:269
pub fn encodeEncryptedExtensions( value: EncryptedExtensions, output: *cursor.Write,) EncodeError!void { const length = try addLength(2, value.extensions.bytes.len); try writeHeader(.encrypted_extensions, length, output); try writeVector16(value.extensions.bytes, output);}Source: lib/quic/src/tls/message/codec.zig:375
pub fn encodeFinished(value: Finished, output: *cursor.Write) EncodeError!void { try writeHeader(.finished, value.verify_data.len, output); try output.put(value.verify_data);}Source: lib/quic/src/tls/message/codec.zig:249
pub fn encodeServerHello(value: ServerHello, output: *cursor.Write) EncodeError!void { var length: usize = 2 + 32 + 1 + 2 + 1 + 2; length = try addLength(length, value.legacy_session_id_echo.len); length = try addLength(length, value.extensions.bytes.len); try writeHeader(.server_hello, length, output); try output.int(u16, value.legacy_version); try output.put(&value.random); try writeVector8(value.legacy_session_id_echo, output); try output.int(u16, value.cipher_suite); try output.byte(value.compression_method); try writeVector16(value.extensions.bytes, output);}Source: lib/quic/src/tls/message/codec.zig:315
pub fn encodeSingleCertificate( request_context: []const u8, certificate: []const u8, output: *cursor.Write,) EncodeError!void { var entries_length = try addLength(3, certificate.len); entries_length = try addLength(entries_length, 2); var length = try addLength(1, request_context.len); length = try addLength(length, 3); length = try addLength(length, entries_length); try writeHeader(.certificate, length, output); try writeVector8(request_context, output); try writeLength(u24, entries_length, output); try writeVector24(certificate, output); try writeVector16(&.{}, output);}Source: lib/quic/src/tls/message/codec.zig:8
pub const extension_count_max: u8 = 64;Source: lib/quic/src/tls/message/codec.zig:144
pub fn findExtension( extensions: Extensions, kind: ExtensionType,) DecodeError!?[]const u8 { var iterator = extensions.iterator(); var found: ?[]const u8 = null; for (0..extension_count_max + 1) |_| { const extension = try iterator.next() orelse return found; if (@backingInt(extension.kind) != @backingInt(kind)) continue; if (found != null) return error.DuplicateExtension; found = extension.data; } unreachable;}Source: lib/quic/src/tls/message/root.zig
const codec = @import("codec.zig");pub const profile = @import("profile.zig");pub const extension_count_max = codec.extension_count_max;pub const certificate_entries_max = codec.certificate_entries_max;pub const Handshake = codec.Handshake;pub const Extension = codec.Extension;pub const Extensions = codec.Extensions;pub const ExtensionIterator = codec.ExtensionIterator;pub const ClientHello = codec.ClientHello;pub const ServerHello = codec.ServerHello;pub const EncryptedExtensions = codec.EncryptedExtensions;pub const CertificateRequest = codec.CertificateRequest;pub const Certificate = codec.Certificate;pub const CertificateEntry = codec.CertificateEntry;pub const CertificateEntries = codec.CertificateEntries;pub const CertificateIterator = codec.CertificateIterator;pub const CertificateVerify = codec.CertificateVerify;pub const Finished = codec.Finished;pub const NewSessionTicket = codec.NewSessionTicket;pub const DecodeError = codec.DecodeError;pub const EncodeError = codec.EncodeError;pub const decode = codec.decode;pub const encode = codec.encode;pub const findExtension = codec.findExtension;pub const decodeClientHello = codec.decodeClientHello;pub const encodeClientHello = codec.encodeClientHello;pub const decodeServerHello = codec.decodeServerHello;pub const encodeServerHello = codec.encodeServerHello;pub const decodeEncryptedExtensions = codec.decodeEncryptedExtensions;pub const encodeEncryptedExtensions = codec.encodeEncryptedExtensions;pub const decodeCertificateRequest = codec.decodeCertificateRequest;pub const encodeCertificateRequest = codec.encodeCertificateRequest;pub const decodeCertificate = codec.decodeCertificate;pub const encodeCertificate = codec.encodeCertificate;pub const encodeSingleCertificate = codec.encodeSingleCertificate;pub const decodeCertificateVerify = codec.decodeCertificateVerify;pub const encodeCertificateVerify = codec.encodeCertificateVerify;pub const decodeFinished = codec.decodeFinished;pub const encodeFinished = codec.encodeFinished;pub const decodeNewSessionTicket = codec.decodeNewSessionTicket;Source: lib/quic/src/tls/root.zig:37
pub const message = @import("message/root.zig");Audit
| Definitions | 42 |
|---|---|
| Public names | 42 |
| Members | 37 |
| Version | 26.7.0 |
| Revision | daab053ee433 |