Skip to documentation
SLOP

tiny.quic.tls.message.profile

Reference tiny.quic tls message profile

Defined in tls.message.

API (14)

Actions

Public operations.

Types and contracts

Public types and contracts.

No direct callersNo direct callstls.messageprofile
Static calls · unresolved targets: unknown · external targets: unknown.

Source

Source: lib/quic/src/tls/message/codec.zig:22

zig
pub const EncodeError = cursor.WriteError || EncodeSpecific;
Called byCallsprivate sourcelib.quic.src.tls.engine.machinevalidateRoleOutputtls.message.profileencodeClientHelloprivate sourcelib.quic.src.tls.message.profileaddprivate sourcelib.quic.src.tls.message.profilevalidateAlpntls.message.profileclientHelloBodyLength
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callsprivate sourcelib.quic.src.properties.tlsexpectCertificateRoundTripprivate sourcelib.quic.src.tls.engine.machine.EnginequeueClientFlightprivate sourcelib.quic.src.tls.engine.machine.EnginequeueServerAuthenticationtls.message.profileencodeCertificate
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallsprivate sourcelib.quic.src.properties.tlsexpectRequestRoundTripprivate sourcelib.quic.src.tls.engine.machine.EnginequeueServerAuthenticationprivate sourcelib.quic.src.tls.message.profilewriteHandshakeHeaderprivate sourcelib.quic.src.tls.message.profilewriteSignatureAlgorithmstls.message.profileencodeCertificateRequest
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallsNo direct callsprivate sourcelib.quic.src.properties.tlsexpectVerifyAndFinishedRoundTripprivate sourcelib.quic.src.tls.engine.machine.EnginequeueSignedAndFinishedtls.message.profileencodeCertificateVerify
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsprivate sourcelib.quic.src.properties.tlsexpectClientHelloRoundTripprivate sourcelib.quic.src.tls.engine.machine.EnginequeueClientHellotls.message.profileclientHelloBodyLengthprivate sourcelib.quic.src.tls.message.profilewriteAlpnprivate sourcelib.quic.src.tls.message.profilewriteCertificateTypeprivate sourcelib.quic.src.tls.message.profilewriteExtensionprivate sourcelib.quic.src.tls.message.profilewriteHandshakeHeader+5 moretls.message.profileencodeClientHello
Static calls · unresolved targets: 1 · external targets: 2.
Called byCallsprivate sourcelib.quic.src.properties.tlsexpectEncryptedRoundTripprivate sourcelib.quic.src.tls.engine.machine.EnginequeueServerAuthenticationtls.message.profileencryptedExtensionsBodyLengthprivate sourcelib.quic.src.tls.message.profilewriteAlpnprivate sourcelib.quic.src.tls.message.profilewriteCertificateTypeprivate sourcelib.quic.src.tls.message.profilewriteExtensionprivate sourcelib.quic.src.tls.message.profilewriteHandshakeHeadertls.message.profileencodeEncryptedExtensions
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsNo direct callsprivate sourcelib.quic.src.properties.tlsexpectFinishedRoundTripprivate sourcelib.quic.src.tls.engine.machine.EnginequeueSignedAndFinishedtls.message.profileencodeFinished
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsprivate sourcelib.quic.src.properties.tlsexpectServerHelloRoundTripprivate sourcelib.quic.src.tls.engine.machine.EnginequeueServerFlighttest sourcelib.quic.src.tls.engine.test.test_RFC_8446_se...3 ServerHello downgrade sentinel abor...test sourcelib.quic.src.tls.engine.test.test_RFC_8446_se...4 HelloRetryRequest abortstest sourcelib.quic.src.tls.engine.test.test_RFC_8446_se...2 X25519 all-zero shared secret abortstls.message.profileserverHelloBodyLengthprivate sourcelib.quic.src.tls.message.profilewriteHandshakeHeaderprivate sourcelib.quic.src.tls.message.profilewriteKeyShareprivate sourcelib.quic.src.tls.message.profilewriteSupportedVersionstls.message.profileencodeServerHello
Static calls · unresolved targets: 1 · external targets: 2.
Called byCallsprivate sourcelib.quic.src.tls.engine.machinevalidateRoleOutputtls.message.profileencodeEncryptedExtensionsprivate sourcelib.quic.src.tls.message.profileaddprivate sourcelib.quic.src.tls.message.profilevalidateAlpntls.message.profileencryptedExtensionsBodyLength
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callsprivate sourcelib.quic.src.tls.engine.machinevalidateConfigtls.message.profileencodeServerHellotls.message.profileserverHelloBodyLength
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/quic/src/tls/message/profile.zig

zig
const std = @import("std");const quic = @import("../../root.zig");const message = @import("root.zig");const cursor = quic.cursor;const ExtensionType = std.crypto.tls.ExtensionType;pub const ClientHello = struct {    random: [32]u8,    key_share: [32]u8,    alpn: []const u8,    transport_parameters: []const u8,    server_name: ?[]const u8,    cipher_suite: std.crypto.tls.CipherSuite = .AES_128_GCM_SHA256,};pub const ServerHello = struct {    random: [32]u8,    key_share: [32]u8,    cipher_suite: std.crypto.tls.CipherSuite,};pub const EncryptedExtensions = struct {    alpn: []const u8,    transport_parameters: []const u8,    acknowledge_server_name: bool,};pub const Error = message.EncodeError;pub fn clientHelloBodyLength(value: ClientHello) Error!usize {    try validateAlpn(value.alpn);    var extensions: usize = 7 + 8 + 8 + 42;    extensions = try add(extensions, 7 + value.alpn.len);    extensions = try add(extensions, 4 + value.transport_parameters.len);    extensions = try add(extensions, 6 + 6);    if (value.server_name) |name| extensions = try add(extensions, 9 + name.len);    return add(45, extensions);}pub fn serverHelloBodyLength() usize {    return 86;}pub fn encryptedExtensionsBodyLength(value: EncryptedExtensions) Error!usize {    try validateAlpn(value.alpn);    var extensions = try add(7 + value.alpn.len, 4 + value.transport_parameters.len);    extensions = try add(extensions, 5 + 5);    if (value.acknowledge_server_name) extensions = try add(extensions, 4);    return add(2, extensions);}pub fn encodeClientHello(value: ClientHello, output: *cursor.Write) Error!void {    const body_length = try clientHelloBodyLength(value);    try writeHandshakeHeader(.client_hello, body_length, output);    try output.int(u16, 0x0303);    try output.put(&value.random);    try output.byte(0);    try output.int(u16, 4);    try output.int(u16, @backingInt(value.cipher_suite));    const alternate: std.crypto.tls.CipherSuite = switch (value.cipher_suite) {        .AES_128_GCM_SHA256 => .CHACHA20_POLY1305_SHA256,        .CHACHA20_POLY1305_SHA256 => .AES_128_GCM_SHA256,        else => return error.InvalidLength,    };    try output.int(u16, @backingInt(alternate));    try output.put(&.{ 1, 0 });    try output.int(u16, @intCast(body_length - 45));    if (value.server_name) |name| try writeServerName(name, output);    try writeSupportedVersions(true, output);    try writeSupportedGroups(output);    try writeSignatureAlgorithms(output);    try writeKeyShare(value.key_share, true, output);    try writeAlpn(value.alpn, output);    try writeExtension(.quic_transport_parameters, value.transport_parameters, output);    try writeCertificateType(.server_certificate_type, true, output);    try writeCertificateType(.client_certificate_type, true, output);}pub fn encodeServerHello(value: ServerHello, output: *cursor.Write) Error!void {    try writeHandshakeHeader(.server_hello, serverHelloBodyLength(), output);    try output.int(u16, 0x0303);    try output.put(&value.random);    try output.byte(0);    try output.int(u16, @backingInt(value.cipher_suite));    try output.byte(0);    try output.int(u16, 46);    try writeSupportedVersions(false, output);    try writeKeyShare(value.key_share, false, output);}pub fn encodeEncryptedExtensions(    value: EncryptedExtensions,    output: *cursor.Write,) Error!void {    const body_length = try encryptedExtensionsBodyLength(value);    try writeHandshakeHeader(.encrypted_extensions, body_length, output);    try output.int(u16, @intCast(body_length - 2));    try writeAlpn(value.alpn, output);    try writeExtension(.quic_transport_parameters, value.transport_parameters, output);    try writeCertificateType(.server_certificate_type, false, output);    try writeCertificateType(.client_certificate_type, false, output);    if (value.acknowledge_server_name) try writeExtension(.server_name, &.{}, output);}pub fn encodeCertificateRequest(output: *cursor.Write) Error!void {    try writeHandshakeHeader(.certificate_request, 11, output);    try output.byte(0);    try output.int(u16, 8);    try writeSignatureAlgorithms(output);}pub fn encodeCertificate(public_key: [32]u8, output: *cursor.Write) Error!void {    const encoded = quic.tls.encodeSubjectPublicKeyInfo(public_key);    try message.encodeSingleCertificate(&.{}, &encoded, output);}pub fn encodeCertificateVerify(signature: [64]u8, output: *cursor.Write) Error!void {    try message.encodeCertificateVerify(.{        .algorithm = .ed25519,        .signature = &signature,    }, output);}pub fn encodeFinished(verify_data: [32]u8, output: *cursor.Write) Error!void {    try message.encodeFinished(.{ .verify_data = &verify_data }, output);}fn writeSupportedVersions(client: bool, output: *cursor.Write) Error!void {    if (client) {        try writeExtensionHeader(.supported_versions, 3, output);        try output.byte(2);    } else {        try writeExtensionHeader(.supported_versions, 2, output);    }    try output.int(u16, 0x0304);}fn writeSupportedGroups(output: *cursor.Write) Error!void {    try writeExtensionHeader(.supported_groups, 4, output);    try output.int(u16, 2);    try output.int(u16, @backingInt(std.crypto.tls.NamedGroup.x25519));}fn writeSignatureAlgorithms(output: *cursor.Write) Error!void {    try writeExtensionHeader(.signature_algorithms, 4, output);    try output.int(u16, 2);    try output.int(u16, @backingInt(std.crypto.tls.SignatureScheme.ed25519));}fn writeKeyShare(key: [32]u8, client: bool, output: *cursor.Write) Error!void {    try writeExtensionHeader(.key_share, if (client) 38 else 36, output);    if (client) try output.int(u16, 36);    try output.int(u16, @backingInt(std.crypto.tls.NamedGroup.x25519));    try output.int(u16, 32);    try output.put(&key);}fn writeAlpn(alpn: []const u8, output: *cursor.Write) Error!void {    try validateAlpn(alpn);    try writeExtensionHeader(.application_layer_protocol_negotiation, 3 + alpn.len, output);    try output.int(u16, @intCast(1 + alpn.len));    try output.byte(@intCast(alpn.len));    try output.put(alpn);}fn writeCertificateType(    kind: ExtensionType,    client: bool,    output: *cursor.Write,) Error!void {    try writeExtensionHeader(kind, if (client) 2 else 1, output);    if (client) try output.byte(1);    try output.byte(@backingInt(std.crypto.tls.CertificateType.RawPublicKey));}fn writeServerName(name: []const u8, output: *cursor.Write) Error!void {    const list_length = try add(3, name.len);    const data_length = try add(2, list_length);    try writeExtensionHeader(.server_name, data_length, output);    try writeLength(u16, list_length, output);    try output.byte(0);    try writeLength(u16, name.len, output);    try output.put(name);}fn writeExtension(    kind: ExtensionType,    data: []const u8,    output: *cursor.Write,) Error!void {    try writeExtensionHeader(kind, data.len, output);    try output.put(data);}fn writeExtensionHeader(    kind: ExtensionType,    length: usize,    output: *cursor.Write,) Error!void {    try output.int(u16, @backingInt(kind));    try writeLength(u16, length, output);}fn writeHandshakeHeader(    kind: std.crypto.tls.HandshakeType,    length: usize,    output: *cursor.Write,) Error!void {    try output.byte(@backingInt(kind));    try writeLength(u24, length, output);}fn writeLength(comptime T: type, length: usize, output: *cursor.Write) Error!void {    if (length > std.math.maxInt(T)) return error.InvalidLength;    try output.int(T, @intCast(length));}fn validateAlpn(alpn: []const u8) Error!void {    if (alpn.len == 0) return error.InvalidLength;    if (alpn.len > std.math.maxInt(u8)) return error.InvalidLength;}fn add(left: usize, right: usize) Error!usize {    return std.math.add(usize, left, right) catch error.InvalidLength;}

Source: lib/quic/src/tls/message/root.zig:3

zig
pub const profile = @import("profile.zig");

Complete call list for tls.message.profile.encodeClientHello

10 direct calls.

Audit

Definitions15
Public names16
Members12
Version26.7.0
Revisiondaab053ee433