Sample code for 30+ languages & platforms
Unicode C

Load Encrypted PEM Containing ECC Private Key and Certs and Examine Contents

See more PEM Examples

Loads an encrypted PEM containing an ECC private key and ECC certificate (and chain), and examines the contents.

Chilkat Unicode C Downloads

Unicode C
#include <C_CkStringBuilderW.h>
#include <C_CkPemW.h>
#include <C_CkPrivateKeyW.h>
#include <C_CkJsonObjectW.h>
#include <C_CkCertW.h>

void ChilkatSample(void)
    {
    BOOL success;
    HCkStringBuilderW sb;
    BOOL bCrlf;
    HCkPemW pem;
    HCkPrivateKeyW privKey;
    HCkJsonObjectW json;
    HCkCertW cert;
    const wchar_t *certXml;

    success = FALSE;

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

    // Create a PEM containing a valid EC private key and certificates.
    // The password for this encrypted PEM is "secret123"

    sb = CkStringBuilderW_Create();
    bCrlf = TRUE;
    CkStringBuilderW_AppendLine(sb,L"-----BEGIN ENCRYPTED PRIVATE KEY-----",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"MIGtMEkGCSqGSIb3DQEFDTA8MBsGCSqGSIb3DQEFDDAOBAiweNs9xIWNoAICCAAw",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"HQYJYIZIAWUDBAECBBCz0IMryNxuJEo5ChMktg9cBGCsKDEeRqGJX4g/X2c6CNtK",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"I8q7KClUwy9ms7ckHZAw/997WuW9QIGGnJEfHL/jSJsZViDwFAB4sunmdHSOTGMD",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"3ZINNlkA+XobMaQtj1HNERtb1qskW1mf/X0sauw5aPA=",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"-----END ENCRYPTED PRIVATE KEY-----",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"-----BEGIN CERTIFICATE-----",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"MIICzjCCAlOgAwIBAgIETULS8zAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJVUzEW",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"MBQGA1UEChMNRW50cnVzdCwgSW5jLjEfMB0GA1UECxMWRm9yIFRlc3QgUHVycG9z",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"ZXMgT25seTElMCMGA1UEAxMcRW50cnVzdCBFQ0MgRGVtb25zdHJhdGlvbiBDQTAe",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"Fw0xNjAzMTgxMjM5MzFaFw0xNjA1MTcxMzA5MzFaMFgxHzAdBgNVBAsTFkZvciBU",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"ZXN0IFB1cnBvc2VzIE9ubHkxHTAbBgNVBAsTFFBlcnNvbmEgTm90IFZlcmlmaWVk",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"MRYwFAYDVQQDEw1DaGlsa2F0IEFkbWluMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"uB62JGMJKXnp1PNsOOIYKGhrzfLev3O+UuthL6UzEqNNDTd8dEYMUQP/DTS3qk98",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"gyQEFxdmZUsPF0fFokkZZ1cV6z7QD3MsPvSjrBzB0GUB3r8CLnDK/F4pF2Q995hr",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"o4HYMIHVMA4GA1UdDwEB/wQEAwIDiDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"BQUHAwQwNwYDVR0fBDAwLjAsoCqgKIYmaHR0cDovL2NybC5lbnRydXN0LmNvbS9D",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"UkwvZWNjZGVtby5jcmwwIAYDVR0RBBkwF4EVYWRtaW5AY2hpbGthdHNvZnQuY29t",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"MB8GA1UdIwQYMBaAFCQFS+Fkghr4Ccz7eHkh+nDmkzLqMB0GA1UdDgQWBBTB82fm",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"vrdG2iX5uS/agVW3L4DisjAJBgNVHRMEAjAAMAoGCCqGSM49BAMDA2kAMGYCMQCH",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"ILghMprWoYPEp9mCE+tpVE7vYwkFV3m0RDzT2BSUezL8Ky78XNk+XPqSB2biT70C",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"MQDCase1oaPY4AxCmjB+rEB1ir+QS8mrtF+iCSqHVv1aIxT6abQL57BZSdvwIm/T",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"T8o=",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"-----END CERTIFICATE-----",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"-----BEGIN CERTIFICATE-----",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"MIICljCCAhugAwIBAgIETUHhezAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJVUzEW",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"MBQGA1UEChMNRW50cnVzdCwgSW5jLjEfMB0GA1UECxMWRm9yIFRlc3QgUHVycG9z",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"ZXMgT25seTElMCMGA1UEAxMcRW50cnVzdCBFQ0MgRGVtb25zdHJhdGlvbiBDQTAe",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"Fw0xMTAxMjcyMDQ5NTRaFw0zNjAxMjcyMTE5NTRaMG0xCzAJBgNVBAYTAlVTMRYw",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"FAYDVQQKEw1FbnRydXN0LCBJbmMuMR8wHQYDVQQLExZGb3IgVGVzdCBQdXJwb3Nl",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"cyBPbmx5MSUwIwYDVQQDExxFbnRydXN0IEVDQyBEZW1vbnN0cmF0aW9uIENBMHYw",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"EAYHKoZIzj0CAQYFK4EEACIDYgAEhCWBpuJuzvRtQyibkcbCj7EkcwAqS2EqRQ/Q",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"ntroTdRM2SssEN4TruTxtwcY/7lR64L6Tfjz3+ujrfjNFss3EWVpUlbOJ+xHC3xH",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"PteNyAGZtHbZO3tVuhP6yX6dFqCCo4GLMIGIMCsGA1UdEAQkMCKADzIwMTEwMTI3",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"MjA0OTU0WoEPMjAzNjAxMjcyMTE5NTRaMAsGA1UdDwQEAwIBBjAfBgNVHSMEGDAW",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"gBQkBUvhZIIa+AnM+3h5Ifpw5pMy6jAdBgNVHQ4EFgQUJAVL4WSCGvgJzPt4eSH6",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"cOaTMuowDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAyAhA70OIb6lb",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"fN6kOTQloHyCLmihNK+PT5wOuaMR//KSQP2c/H18YhDYnlwMxF9fAjEA0URaJOXM",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"F0qwdvS2rm7N5PWMLc/4BbeOZyZ94XJiG5u96iTgp6N9JI0MMmCQE87N",bCrlf);
    CkStringBuilderW_AppendLine(sb,L"-----END CERTIFICATE-----",bCrlf);

    pem = CkPemW_Create();
    success = CkPemW_LoadPem(pem,CkStringBuilderW_getAsString(sb),L"secret123");
    if (success == FALSE) {
        wprintf(L"%s\n",CkPemW_lastErrorText(pem));
        CkStringBuilderW_Dispose(sb);
        CkPemW_Dispose(pem);
        return;
    }

    // Get the private key and examine it in JSON Web Key form (JWK)

    privKey = CkPrivateKeyW_Create();
    success = CkPemW_PrivateKeyAt(pem,0,privKey);
    if (success == FALSE) {
        wprintf(L"%s\n",CkPemW_lastErrorText(pem));
        CkStringBuilderW_Dispose(sb);
        CkPemW_Dispose(pem);
        CkPrivateKeyW_Dispose(privKey);
        return;
    }

    json = CkJsonObjectW_Create();
    CkJsonObjectW_Load(json,CkPrivateKeyW_getJwk(privKey));
    CkJsonObjectW_putEmitCompact(json,FALSE);
    wprintf(L"%s\n",CkJsonObjectW_emit(json));

    // JWK output:

    // 	{ 
    // 	  "kty": "EC",
    // 	  "crv": "P-384",
    // 	  "x": "uB62JGMJKXnp1PNsOOIYKGhrzfLev3O-UuthL6UzEqNNDTd8dEYMUQP_DTS3qk98",
    // 	  "y": "gyQEFxdmZUsPF0fFokkZZ1cV6z7QD3MsPvSjrBzB0GUB3r8CLnDK_F4pF2Q995hr",
    // 	  "d": "ugTy2ZpuQqv1uQyLSgz1SPRvngzrd5vLyzU2ICaJd25zZRIxxlNR-uFo9UWC6llt"
    // 	}

    // Now get 1st certificate and examine in XML format:

    cert = CkCertW_Create();
    success = CkPemW_CertAt(pem,0,cert);
    if (success == FALSE) {
        wprintf(L"%s\n",CkPemW_lastErrorText(pem));
        CkStringBuilderW_Dispose(sb);
        CkPemW_Dispose(pem);
        CkPrivateKeyW_Dispose(privKey);
        CkJsonObjectW_Dispose(json);
        CkCertW_Dispose(cert);
        return;
    }

    certXml = CkCertW_exportCertXml(cert);
    wprintf(L"%s\n",certXml);

    // XML output:

    // <?xml version="1.0" encoding="utf-8" ?>
    // <sequence>
    //     <sequence>
    //         <contextSpecific tag="0" constructed="1">
    //             <int>02</int>
    //         </contextSpecific>
    //         <int>4D42D2F3</int>
    //         <sequence>
    //             <oid>1.2.840.10045.4.3.3</oid>
    //         </sequence>
    //         <sequence>
    //             <set>
    //                 <sequence>
    //                     <oid>2.5.4.6</oid>
    //                     <printable>US</printable>
    //                 </sequence>
    //             </set>
    //             <set>
    //                 <sequence>
    //                     <oid>2.5.4.10</oid>
    //                     <printable>Entrust, Inc.</printable>
    //                 </sequence>
    //             </set>
    //             <set>
    //                 <sequence>
    //                     <oid>2.5.4.11</oid>
    //                     <printable>For Test Purposes Only</printable>
    //                 </sequence>
    //             </set>
    //             <set>
    //                 <sequence>
    //                     <oid>2.5.4.3</oid>
    //                     <printable>Entrust ECC Demonstration CA</printable>
    //                 </sequence>
    //             </set>
    //         </sequence>
    //         <sequence>
    //             <utctime>160318123931Z</utctime>
    //             <utctime>160517130931Z</utctime>
    //         </sequence>
    //         <sequence>
    //             <set>
    //                 <sequence>
    //                     <oid>2.5.4.11</oid>
    //                     <printable>For Test Purposes Only</printable>
    //                 </sequence>
    //             </set>
    //             <set>
    //                 <sequence>
    //                     <oid>2.5.4.11</oid>
    //                     <printable>Persona Not Verified</printable>
    //                 </sequence>
    //             </set>
    //             <set>
    //                 <sequence>
    //                     <oid>2.5.4.3</oid>
    //                     <printable>Chilkat Admin</printable>
    //                 </sequence>
    //             </set>
    //         </sequence>
    //         <sequence>
    //             <sequence>
    //                 <oid>1.2.840.10045.2.1</oid>
    //                 <oid>1.3.132.0.34</oid>
    //             </sequence>
    //             <bits n="776">04B81EB62463092979E9D4F36C38E21828686BCDF2DEBF73BE52EB612FA53312A34D0D377C74460C5103FF0D34B7AA4F7C832404171766654B0F1747C5A24919675715EB3ED00F732C3EF4A3AC1CC1D06501DEBF022E70CAFC5E2917643DF7986B</bits>
    //         </sequence>
    //         <contextSpecific tag="3" constructed="1">
    //             <sequence>
    //                 <sequence>
    //                     <oid>2.5.29.15</oid>
    //                     <bool>1</bool>
    //                     <octets>AwIDiA==</octets>
    //                 </sequence>
    //                 <sequence>
    //                     <oid>2.5.29.37</oid>
    //                     <octets>MBQGCCsGAQUFBwMCBggrBgEFBQcDBA==</octets>
    //                 </sequence>
    //                 <sequence>
    //                     <oid>2.5.29.31</oid>
    //                     <octets>MC4wLKAqoCiGJmh0dHA6Ly9jcmwuZW50cnVzdC5jb20vQ1JML2VjY2RlbW8uY3Js</octets>
    //                 </sequence>
    //                 <sequence>
    //                     <oid>2.5.29.17</oid>
    //                     <octets>MBeBFWFkbWluQGNoaWxrYXRzb2Z0LmNvbQ==</octets>
    //                 </sequence>
    //                 <sequence>
    //                     <oid>2.5.29.35</oid>
    //                     <octets>MBaAFCQFS+Fkghr4Ccz7eHkh+nDmkzLq</octets>
    //                 </sequence>
    //                 <sequence>
    //                     <oid>2.5.29.14</oid>
    //                     <octets>BBTB82fmvrdG2iX5uS/agVW3L4Disg==</octets>
    //                 </sequence>
    //                 <sequence>
    //                     <oid>2.5.29.19</oid>
    //                     <octets>MAA=</octets>
    //                 </sequence>
    //             </sequence>
    //         </contextSpecific>
    //     </sequence>
    //     <sequence>
    //         <oid>1.2.840.10045.4.3.3</oid>
    //     </sequence>
    //     <bits n="832">30660231008720B821329AD6A183C4A7D98213EB69544EEF6309055779B4443CD3D814947B32FC2B2EFC5CD93E5CFA920766E24FBD023100C26AC7B5A1A3D8E00C429A307EAC40758ABF904BC9ABB45FA2092A8756FD5A2314FA69B40BE7B05949DBF0226FD34FCA</bits>
    // </sequence>
    // 
    // 
    // 


    CkStringBuilderW_Dispose(sb);
    CkPemW_Dispose(pem);
    CkPrivateKeyW_Dispose(privKey);
    CkJsonObjectW_Dispose(json);
    CkCertW_Dispose(cert);

    }