Sample code for 30+ languages & platforms
Zig

Encrypt MIME using RSAES-OAEP with SHA256 and AES-128 content encryption

See more MIME Examples

Demonstrates how to encrypt MIME using RSAES-OAEP with SHA256 and AES-128 content encryption.

Note: This example requires Chilkat v9.5.0.67 or greater.

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();

    // This requires the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    const mime = try chilkat.Mime.init();
    defer mime.deinit();

    // Create a MIME message to encrypt.
    mime.newMultipartMixed() catch {};
    mime.addHeaderField("someHeader1", "Some value 1") catch {};
    mime.addHeaderField("someHeader2", "Some value 2") catch {};

    const part0 = try chilkat.Mime.init();
    defer part0.deinit();
    part0.addHeaderField("hdrA", "Some value A") catch {};
    part0.addHeaderField("hdrB", "Some value B") catch {};
    part0.setContentType("text/plain");
    part0.setBody("This is the plain-text body.");

    const part1 = try chilkat.Mime.init();
    defer part1.deinit();
    part1.addHeaderField("hdrX", "Some value X") catch {};
    part1.addHeaderField("hdrY", "Some value Y") catch {};
    part1.setContentType("text/xml");
    part1.setBody("<a>This is the XML body</a>");

    mime.appendPart(part0) catch {};
    mime.appendPart(part1) catch {};

    // The MIME to be encrypted:
    const sb_mime = try chilkat.StringBuilder.init();
    defer sb_mime.deinit();
    mime.getMimeSb(sb_mime) catch {};
    std.debug.print("{s}\n", .{try sb_mime.getAsString(alloc)});

    //     Content-Type: multipart/mixed; boundary="------------080303020600020604010008"
    //     someHeader1: Some value 1
    //     someHeader2: Some value 2
    //
    //     --------------080303020600020604010008
    //     hdrA: Some value A
    //     hdrB: Some value B
    //     Content-Type: text/plain
    //
    //     This is the plain-text body.
    //     --------------080303020600020604010008
    //     hdrX: Some value X
    //     hdrY: Some value Y
    //     Content-Type: text/xml
    //
    //     <a>This is the XML body</a>
    //     --------------080303020600020604010008--
    //

    // Load an RSA-based certificate.
    // (Encrypting MIME only requires the public key.  Decrypting MIME requires the private key.)
    const cert = try chilkat.Cert.init();
    defer cert.deinit();
    cert.loadFromFile("qa_data/rsaes-oaep/cert.pem") catch {
        std.debug.print("{s}\n", .{try cert.getLastErrorText(alloc)});
        return;
    };

    // Set the email object properties to indicate the desired encryption.
    mime.setPkcs7CryptAlg("aes");
    // If AES-256 is desired, set the following property to 256.
    mime.setPkcs7KeyLength(128);
    mime.setOaepPadding(true);
    // Other choices for the OAEP hash algorithm are "sha1", "sha384", and "sha512"
    mime.setOaepHash("sha256");

    // Encrypt the MIME (to create S/MIME, which stands for "Secure MIME")
    mime.encrypt(cert) catch {
        std.debug.print("{s}\n", .{try mime.getLastErrorText(alloc)});
        return;
    };

    std.debug.print("---------------\n", .{});
    std.debug.print("Encrypted MIME:\n", .{});
    std.debug.print("---------------\n", .{});
    std.debug.print("{s}\n", .{try mime.getMime(alloc)});

    std.debug.print("Success.\n", .{});

    // ---------------------------------------------------
    // This is sample output for RSAES-OAEP encrypted MIME:
    // ---------------------------------------------------

    // Content-Type: application/x-pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data"
    // someHeader1: Some value 1
    // someHeader2: Some value 2
    // Content-Disposition: attachment; filename="smime.p7m"
    // Content-Transfer-Encoding: base64
    //
    // MIIDvAYJKoZIhvcNAQcDoIIDrTCCA6kCAQAxggGgMIIBnAIBADB1MGgxCzAJBgNVBAYTAlVTMQsw
    // CQYDVQQIDAJJTDEQMA4GA1UEBwwHV2hlYXRvbjEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ
    // dHkgTHRkMRcwFQYDVQQDDA5DaGlsa2F0V2lkZ2V0cwIJAMRwugDmvniwMBwGCSqGSIb3DQEBBzAP
    // oA0wCwYJYIZIAWUDBAIBBIIBAFaUL1ga1bOrdqYKcMm+FHUacBvzfBxk0fnPA0AMBdN8BvTWT3CN
    // YuqBhjOGyq0FpYD9pVZybUuFMCVsVyIW2O62HnsOK58YaPEUUcdH2sI+yjqX9UAn0P0nVDSsVdeK
    // W8x9kMfZg+3UP+y1q+lu7VRJO3f2C9oLQpTkc4VW4n7UOcUI0waykLCjCTL8lFDb7/J3GeuMKyhH
    // 5riNz50kpbzqn7m2Ks9yA+QmcTdXclclGFr2vwEUFzSdT2pxh/vaUrogCxkYWbQ2eV7vZg6O4kV0
    // aqHBqySkPTAzHKiHH8K8GVdlTuJ8350CpICa4T8w7/Ht5I7dyOPPKy4C+rVtrvcwggH+BgkqhkiG
    // 9w0BBwEwHQYJYIZIAWUDBAECBBDTC2WNBN+z2I47/4Feu9YqgIIB0MZvl3nC/q/Wzil6HtfQTr12
    // Q5moHY+ORzAa1P9XvX2ZUFhW530mV395mQw/A4o4ekmX9eRPEZquYzZPLT8hNeZIuNdhpcSQUmad
    // rKnKkR0wKJ3jJ3LhOIohVBQSYs8kVDZKq6lJBIznlsurFelZoNEhyRschhteDZx5rb7fCe8c2+/O
    // DHxaqaHCAzm/Bd7kcg6FFfuTZy3tu0PgP5IsXN4OFA3kkvwjAs4XsVS8jdIcmDNBkYieE8WmJOIm
    // Mz7mh/CHWLgWfGKa0Dkb9RcbFgLwYNT3GzuXFw9XPbKkEZjEAtJajWbN6P0WQl96YYd9qZxUpGxZ
    // zjTHEYzViUdUXolfpLufttrRXyxN1RFWhNFMFbv66xYqklMSgpdM/Mbk+EuvX6eXayDPvDBpfYMw
    // NoRAzv1Ony2c0ez9rBemJICicxAzpuvHbRxdjYs63Dnv+TYgpBK12AxWWpPIjXvw0WQKgTC3Tg8s
    // EnuGhpENqso/clJBEBSn4+2WhYtYbdI5sVme67lvqQl1Xxy3r18SWaQbyDOwgYi1E+54lMDOxMy0
    // y0FPHk5pP45DnXWj+XORPp5LhuZr5mf62YOXSSUwR5P0cXy4Rc+pN5lhRQPCf5z2
}