tiny.quic.tls.message.profile
Defined in tls.message.
API (14)
Actions
Public operations.
clientHelloBodyLengthencodeCertificateencodeCertificateRequestencodeCertificateVerifyencodeClientHelloencodeEncryptedExtensionsencodeFinishedencodeServerHelloencryptedExtensionsBodyLengthserverHelloBodyLength
Types and contracts
Public types and contracts.
Source
Source: lib/quic/src/tls/message/codec.zig:22
zig
pub const EncodeError = cursor.WriteError || EncodeSpecific;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.
tiny.quic.tls.message.profile.clientHelloBodyLength[function] atlib/quic/src/tls/message/profile.zig:31lib.quic.src.tls.message.profile.writeAlpn[function] — private source atlib/quic/src/tls/message/profile.zig:159in nearest public ownertiny.quic.tls.message.profilelib.quic.src.tls.message.profile.writeCertificateType[function] — private source atlib/quic/src/tls/message/profile.zig:167in nearest public ownertiny.quic.tls.message.profilelib.quic.src.tls.message.profile.writeExtension[function] — private source atlib/quic/src/tls/message/profile.zig:187in nearest public ownertiny.quic.tls.message.profilelib.quic.src.tls.message.profile.writeHandshakeHeader[function] — private source atlib/quic/src/tls/message/profile.zig:205in nearest public ownertiny.quic.tls.message.profilelib.quic.src.tls.message.profile.writeKeyShare[function] — private source atlib/quic/src/tls/message/profile.zig:151in nearest public ownertiny.quic.tls.message.profilelib.quic.src.tls.message.profile.writeServerName[function] — private source atlib/quic/src/tls/message/profile.zig:177in nearest public ownertiny.quic.tls.message.profilelib.quic.src.tls.message.profile.writeSignatureAlgorithms[function] — private source atlib/quic/src/tls/message/profile.zig:145in nearest public ownertiny.quic.tls.message.profilelib.quic.src.tls.message.profile.writeSupportedGroups[function] — private source atlib/quic/src/tls/message/profile.zig:139in nearest public ownertiny.quic.tls.message.profilelib.quic.src.tls.message.profile.writeSupportedVersions[function] — private source atlib/quic/src/tls/message/profile.zig:129in nearest public ownertiny.quic.tls.message.profile
Audit
| Definitions | 15 |
|---|---|
| Public names | 16 |
| Members | 12 |
| Version | 26.7.0 |
| Revision | daab053ee433 |