Sample code for 30+ languages & platforms
Zig

Add an S/MIME Detached Signature

See more MIME Examples

Demonstrates the Chilkat Mime.AddDetachedSignature method, which creates an S/MIME detached signature. The only argument is the signing Cert, which must have access to its private key. On success the entity becomes a multipart/signed with the content and a separate signature part.

Note: The file paths are relative to the application's current working directory. Absolute paths may also be used. Supply the paths appropriate to your own environment.

Background: A detached signature (multipart/signed) keeps the original content readable alongside a separate signature part — so recipients whose software does not understand S/MIME still see the message, they just cannot verify it. That backward compatibility makes detached the usual choice for signed email. The signer proves authorship with a certificate that carries its private key.

Chilkat Zig Downloads

Zig
const std = @import("std");
const chilkat = @import("chilkat");

pub fn main(init: std.process.Init) !void {
    const alloc = init.arena.allocator();

    const mime = try chilkat.Mime.init();
    defer mime.deinit();
    mime.setBodyFromPlainText("This message will be signed.") catch {
        std.debug.print("{s}\n", .{try mime.getLastErrorText(alloc)});
        return;
    };

    // Load the signing certificate (which must have access to its private key) from a PFX file.
    // The PFX password should come from a secure source rather than being hard-coded.
    const pfx_password = "myPfxPassword";
    const cert = try chilkat.Cert.init();
    defer cert.deinit();
    cert.loadPfxFile("qa_data/signer.pfx", pfx_password) catch {
        std.debug.print("{s}\n", .{try cert.getLastErrorText(alloc)});
        return;
    };

    // Create an S/MIME detached signature.  The object becomes a multipart/signed entity with the
    // original content and a separate signature part.
    mime.addDetachedSignature(cert) catch {
        std.debug.print("{s}\n", .{try mime.getLastErrorText(alloc)});
        return;
    };

    mime.saveMime("qa_output/signed.eml") catch {
        std.debug.print("{s}\n", .{try mime.getLastErrorText(alloc)});
        return;
    };

    std.debug.print("Detached signature added.\n", .{});
}