Zig
Zig
S/MIME Decrypt using Certificate and Private Key in Apple Keychain
See more Apple Keychain Examples
Decrypts S/MIME using a certificate with private key found in the Apple Keychain.Chilkat Zig Downloads
const std = @import("std");
const chilkat = @import("chilkat");
pub fn main(init: std.process.Init) !void {
const alloc = init.arena.allocator();
const cert = try chilkat.Cert.init();
defer cert.deinit();
// Load the certificate to be used for decryption by the Subject Common Name
// On MacOS and iOS, Chilkat will search the Keychain(s) for the matching certificate.
// Note: The private key must be present to decrypt.
cert.loadByCommonName("My Cert") catch {
std.debug.print("{s}\n", .{try cert.getLastErrorText(alloc)});
return;
};
std.debug.print("Cert has private key: {}\n", .{cert.hasPrivateKey()});
// Load the MIME to be decrypted.
// We encrypted using this example: S/MIME Encrypt using Certificate in Apple Keychain
const mime = try chilkat.Mime.init();
defer mime.deinit();
mime.loadMimeFile("./encrypted.mime") catch {
std.debug.print("{s}\n", .{try mime.getLastErrorText(alloc)});
return;
};
std.debug.print("{s}\n", .{try mime.getMime(alloc)});
std.debug.print("----\n", .{});
// Here's the encrypted MIME:
// Subject: test
// SomeHeader: 123
// Content-Type: application/x-pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data"
// Content-Disposition: attachment; filename="smime.p7m"
// Content-Transfer-Encoding: base64
//
// MIICSwYJKoZIhvcNAQcDoIICPDCCAjgCAQAxggGzMIIBrwIBADCBljCBgTELMAkGA1UEBhMCSVQx
// EDAOBgNVBAgMB0JlcmdhbW8xGTAXBgNVBAcMEFBvbnRlIFNhbiBQaWV0cm8xFzAVBgNVBAoMDkFj
// dGFsaXMgUy5wLkEuMSwwKgYDVQQDDCNBY3RhbGlzIENsaWVudCBBdXRoZW50aWNhdGlvbiBDQSBH
// MwIQPCWvkSv8oQ7xRmEHJ6TzEDANBgkqhkiG9w0BAQEFAASCAQB3VZvHRE5EWxug7Sckpcz1ucDZ
// YiTKiqmyPt75MhzNRQLtKFx/jWwlemUwnPMzeu6yutCkZ74Bdn7MBsfDqV3bUz43wAu+fRBteGvF
// mTc00MfY8L7o8dkpj4AqAOCj4hKQzbSE99GvSzyXcPE2Gm5NrOPtKxqfFqbBRTCb4fBZP84LaL+x
// rnYfrM4qXTppixyN8iFYCd4maEbMu/GA5o+j0BkDDnx42pILDoAGV/ERyx55Y3Nc2Mhm/cITBMNn
// g7uS9KPrlYizNaqVu09Hi9jg4gdZaRiTjUqg05tSOk/YqIQxTgfscwSPY92/ewpI6e1EHtLt8Q33
// gWCbERptSntUMHwGCSqGSIb3DQEHATAdBglghkgBZQMEAQIEENm1AxeXlEMx7p6McjHIj5CAUEQj
// 0GuJ5LnTqiqIjOiwmwNidl1N1TRluxX5vAQvwBuYE6bQK4+i04yn2Av3cucW4kvxgP2Nmni+XgQt
// aPPKlasaVceEeZ15IYjw77/m3YYn
// -------------------------------------
// Decrypt the MIME.
mime.decryptUsingCert(cert) catch {
std.debug.print("{s}\n", .{try mime.getLastErrorText(alloc)});
return;
};
// -------------------------------------
// Note: A password dialog may be shown, possibly twice, when accessing the private key.
// See the following blog post explaining how to suppress the dialog:
// Suppress Password Dialog when Accessing Private Key in Apple Keychain
// Show the unencrypted MIME
std.debug.print("{s}\n", .{try mime.getMime(alloc)});
// Here's the decrypted MIME
// Subject: test
// SomeHeader: 123
// Content-Type: text/plain
//
// This is the body.
}