Sample code for 30+ languages & platforms
Swift

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 Swift Downloads

Swift

func chilkatTest() {
    var success: Bool = 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"

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

    let pem = CkoPem()!
    success = pem.load(pemContent: sb.getAsString(), password: "secret123")
    if success == false {
        print("\(pem.lastErrorText!)")
        return
    }

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

    let privKey = CkoPrivateKey()!
    success = pem.privateKey(at: 0, privKey: privKey)
    if success == false {
        print("\(pem.lastErrorText!)")
        return
    }

    let json = CkoJsonObject()!
    json.load(json: privKey.getJwk())
    json.emitCompact = false
    print("\(json.emit()!)")

    // 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:

    let cert = CkoCert()!
    success = pem.cert(at: 0, cert: cert)
    if success == false {
        print("\(pem.lastErrorText!)")
        return
    }

    var certXml: String? = cert.exportXml()
    print("\(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>
    // 
    // 
    // 

}