|
| 1 | +/* |
| 2 | + * Copyright (c) 2024 Oleg Yukhnevich. Use of this source code is governed by the Apache 2.0 license. |
| 3 | + */ |
| 4 | + |
| 5 | +package dev.whyoleg.cryptography.serialization.pem.benchmarks |
| 6 | + |
| 7 | +import dev.whyoleg.cryptography.serialization.pem.* |
| 8 | +import kotlinx.benchmark.* |
| 9 | +import kotlinx.io.* |
| 10 | +import kotlinx.io.bytestring.* |
| 11 | + |
| 12 | +@State(Scope.Benchmark) |
| 13 | +@Warmup(iterations = 5, time = 1) |
| 14 | +@Measurement(iterations = 5, time = 1) |
| 15 | +@OutputTimeUnit(BenchmarkTimeUnit.MILLISECONDS) |
| 16 | +@BenchmarkMode(Mode.Throughput) |
| 17 | +class PemBenchmark { |
| 18 | + @Param("privateKey", "certificate", "googleCertificateChain") |
| 19 | + var testCaseString: String = "" |
| 20 | + lateinit var testCase: TestCase |
| 21 | + |
| 22 | + @Setup |
| 23 | + fun setup() { |
| 24 | + testCase = when (testCaseString) { |
| 25 | + "privateKey" -> TestCase.privateKey |
| 26 | + "certificate" -> TestCase.certificate |
| 27 | + "googleCertificateChain" -> TestCase.googleCertificateChain |
| 28 | + else -> error("Unknown test case: $testCaseString") |
| 29 | + } |
| 30 | + println(testCase.documentString) |
| 31 | + } |
| 32 | + |
| 33 | + @Benchmark |
| 34 | + fun encodeToString(): String { |
| 35 | + return testCase.document.encodeToString() |
| 36 | + } |
| 37 | + |
| 38 | + @Benchmark |
| 39 | + fun encodeToByteString(): ByteString { |
| 40 | + return testCase.document.encodeToByteString() |
| 41 | + } |
| 42 | + |
| 43 | + @Benchmark |
| 44 | + fun encodeToSink(): Sink { |
| 45 | + return Buffer().also { testCase.document.encodeToSink(it) } |
| 46 | + } |
| 47 | + |
| 48 | + @Benchmark |
| 49 | + fun decodeFromString(): PemDocument { |
| 50 | + return PemDocument.decode(testCase.documentString) |
| 51 | + } |
| 52 | + |
| 53 | + @Benchmark |
| 54 | + fun decodeFromByteString(): PemDocument { |
| 55 | + return PemDocument.decode(testCase.documentBytes) |
| 56 | + } |
| 57 | + |
| 58 | + @Benchmark |
| 59 | + fun decodeFromSource(): PemDocument { |
| 60 | + return PemDocument.decode(Buffer().also { it.write(testCase.documentBytes) }) |
| 61 | + } |
| 62 | + |
| 63 | + @Benchmark |
| 64 | + fun decodeToSequenceFromString(): List<PemDocument> { |
| 65 | + return PemDocument.decodeToSequence(testCase.documentString).toList() |
| 66 | + } |
| 67 | + |
| 68 | + @Benchmark |
| 69 | + fun decodeToSequenceFromByteString(): List<PemDocument> { |
| 70 | + return PemDocument.decodeToSequence(testCase.documentBytes).toList() |
| 71 | + } |
| 72 | + |
| 73 | + @Benchmark |
| 74 | + fun decodeToSequenceFromSource(): List<PemDocument> { |
| 75 | + return PemDocument.decodeToSequence(Buffer().also { it.write(testCase.documentBytes) }).toList() |
| 76 | + } |
| 77 | + |
| 78 | + class TestCase private constructor( |
| 79 | + val document: PemDocument, |
| 80 | + val documentString: String, |
| 81 | + val documentBytes: ByteString, |
| 82 | + ) { |
| 83 | + companion object { |
| 84 | + private fun String.toTestCase() = TestCase( |
| 85 | + document = PemDocument.decode(this), |
| 86 | + documentString = this, |
| 87 | + documentBytes = this.encodeToByteString() |
| 88 | + ) |
| 89 | + |
| 90 | + val privateKey = """ |
| 91 | + -----BEGIN PRIVATE KEY----- |
| 92 | + MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDAU9BD0jxDfF5OV380z |
| 93 | + 9VIEUN2W5kJDZ3hbuaDenCxLiAMsoquKTfFaou71eLdN0TShZANiAARMUhCee/cp |
| 94 | + xmjGc1roj0D0k6VlUqtA+JVCWigXcIAukOeTHCngZDKCrD4PkXDBvbciJdZKvO+l |
| 95 | + ml2FIkoovZh/8yeTKmjUMb804g6OmjUc9vVojCRV0YdaSmYkkJMJbLg= |
| 96 | + -----END PRIVATE KEY----- |
| 97 | + """.trimIndent().toTestCase() |
| 98 | + |
| 99 | + val certificate = """ |
| 100 | + -----BEGIN CERTIFICATE----- |
| 101 | + MIIH/TCCBeWgAwIBAgIQaBYE3/M08XHYCnNVmcFBcjANBgkqhkiG9w0BAQsFADBy |
| 102 | + MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0b24x |
| 103 | + ETAPBgNVBAoMCFNTTCBDb3JwMS4wLAYDVQQDDCVTU0wuY29tIEVWIFNTTCBJbnRl |
| 104 | + cm1lZGlhdGUgQ0EgUlNBIFIzMB4XDTIwMDQwMTAwNTgzM1oXDTIxMDcxNjAwNTgz |
| 105 | + M1owgb0xCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91 |
| 106 | + c3RvbjERMA8GA1UECgwIU1NMIENvcnAxFjAUBgNVBAUTDU5WMjAwODE2MTQyNDMx |
| 107 | + FDASBgNVBAMMC3d3dy5zc2wuY29tMR0wGwYDVQQPDBRQcml2YXRlIE9yZ2FuaXph |
| 108 | + dGlvbjEXMBUGCysGAQQBgjc8AgECDAZOZXZhZGExEzARBgsrBgEEAYI3PAIBAxMC |
| 109 | + VVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDHheRkbb1FCc7xRKst |
| 110 | + wK0JIGaKY8t7JbS2bQ2b6YIJDgnHuIYHqBrCUV79oelikkokRkFvcvpaKinFHDQH |
| 111 | + UpWEI6RUERYmSCg3O8Wi42uOcV2B5ZabmXCkwdxY5Ecl51BbM8UnGdoAGbdNmiRm |
| 112 | + SmTjcs+lhMxg4fFY6lBpiEVFiGUjGRR+61R67Lz6U4KJeLNcCm07QwFYKBmpi08g |
| 113 | + dygSvRdUw55Jopredj+VGtjUkB4hFT4GQX/ght69Rlqz/+8u0dEQkhuUuucrqalm |
| 114 | + SGy43HRwBfDKFwYeWM7CPMd5e/dO+t08t8PbjzVTTv5hQDCsEYIV2T7AFI9ScNxM |
| 115 | + kh7/AgMBAAGjggNBMIIDPTAfBgNVHSMEGDAWgBS/wVqH/yj6QT39t0/kHa+gYVgp |
| 116 | + vTB/BggrBgEFBQcBAQRzMHEwTQYIKwYBBQUHMAKGQWh0dHA6Ly93d3cuc3NsLmNv |
| 117 | + bS9yZXBvc2l0b3J5L1NTTGNvbS1TdWJDQS1FVi1TU0wtUlNBLTQwOTYtUjMuY3J0 |
| 118 | + MCAGCCsGAQUFBzABhhRodHRwOi8vb2NzcHMuc3NsLmNvbTAfBgNVHREEGDAWggt3 |
| 119 | + d3cuc3NsLmNvbYIHc3NsLmNvbTBfBgNVHSAEWDBWMAcGBWeBDAEBMA0GCyqEaAGG |
| 120 | + 9ncCBQEBMDwGDCsGAQQBgqkwAQMBBDAsMCoGCCsGAQUFBwIBFh5odHRwczovL3d3 |
| 121 | + dy5zc2wuY29tL3JlcG9zaXRvcnkwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF |
| 122 | + BwMBMEgGA1UdHwRBMD8wPaA7oDmGN2h0dHA6Ly9jcmxzLnNzbC5jb20vU1NMY29t |
| 123 | + LVN1YkNBLUVWLVNTTC1SU0EtNDA5Ni1SMy5jcmwwHQYDVR0OBBYEFADAFUIazw5r |
| 124 | + ZIHapnRxIUnpw+GLMA4GA1UdDwEB/wQEAwIFoDCCAX0GCisGAQQB1nkCBAIEggFt |
| 125 | + BIIBaQFnAHcA9lyUL9F3MCIUVBgIMJRWjuNNExkzv98MLyALzE7xZOMAAAFxM0ho |
| 126 | + bwAABAMASDBGAiEA6xeliNR8Gk/63pYdnS/vOx/CjptEMEv89WWh1/urWIECIQDy |
| 127 | + BreHU25DzwukQaRQjwW655ZLkqCnxbxQWRiOemj9JAB1AJQgvB6O1Y1siHMfgosi |
| 128 | + LA3R2k1ebE+UPWHbTi9YTaLCAAABcTNIaNwAAAQDAEYwRAIgGRE4wzabNRdD8kq/ |
| 129 | + vFP3tQe2hm0x5nXulowh4Ibw3lkCIFYb/3lSDplS7AcR4r+XpWtEKSTFWJmNCRbc |
| 130 | + XJur2RGBAHUA7sCV7o1yZA+S48O5G8cSo2lqCXtLahoUOOZHssvtxfkAAAFxM0ho |
| 131 | + 8wAABAMARjBEAiB6IvboWss3R4ItVwjebl7D3yoFaX0NDh2dWhhgwCxrHwIgCfq7 |
| 132 | + ocMC5t+1ji5M5xaLmPC4I+WX3I/ARkWSyiO7IQcwDQYJKoZIhvcNAQELBQADggIB |
| 133 | + ACeuur4QnujqmguSrHU3mhf+cJodzTQNqo4tde+PD1/eFdYAELu8xF+0At7xJiPY |
| 134 | + i5RKwilyP56v+3iY2T9lw7S8TJ041VLhaIKp14MzSUzRyeoOAsJ7QADMClHKUDlH |
| 135 | + UU2pNuo88Y6igovT3bsnwJNiEQNqymSSYhktw0taduoqjqXn06gsVioWTVDXysd5 |
| 136 | + qEx4t6sIgIcMm26YH1vJpCQEhKpc2y07gRkklBZRtMjThv4cXyyMX7uTcdT7AJBP |
| 137 | + ueifCoV25JxXuo8d5139gwP1BAe7IBVPx2u7KN/UyOXdZmwMf/TmFGwDdCfsyHf/ |
| 138 | + ZsB2wLHozTYoAVmQ9FoU1JLgcVivqJ+vNlBhHXhlxMdN0j80R9Nz6EIglQjeK3O8 |
| 139 | + I/cFGm/B8+42hOlCId9ZdtndJcRJVji0wD0qwevCafA9jJlHv/jsE+I9Uz6cpCyh |
| 140 | + sw+lrFdxUgqU58axqeK89FR+No4q0IIO+Ji1rJKr9nkSB0BqXozVnE1YB/KLvdIs |
| 141 | + uYZJuqb2pKku+zzT6gUwHUTZvBiNOtXL4Nxwc/KT7WzOSd2wP10QI8DKg4vfiNDs |
| 142 | + HWmB1c4Kji6gOgA5uSUzaGmq/v4VncK5Ur+n9LbfnfLc28J5ft/GotinMyDk3iar |
| 143 | + F10YlqcOmeX1uFmKbdi/XorGlkCoMF3TDx8rmp9DBiB/ |
| 144 | + -----END CERTIFICATE----- |
| 145 | + """.trimIndent().toTestCase() |
| 146 | + |
| 147 | + // obtained via `openssl s_client -showcerts -connect www.google.com:443` |
| 148 | + val googleCertificateChain = """ |
| 149 | + 0 s:CN=www.google.com |
| 150 | + i:C=US, O=Google Trust Services, CN=WR2 |
| 151 | + a:PKEY: EC, (prime256v1); sigalg: sha256WithRSAEncryption |
| 152 | + v:NotBefore: Jul 7 08:35:54 2025 GMT; NotAfter: Sep 29 08:35:53 2025 GMT |
| 153 | + -----BEGIN CERTIFICATE----- |
| 154 | + MIIEVTCCAz2gAwIBAgIQc5TC2nLrVf4Kw1L8a17XyTANBgkqhkiG9w0BAQsFADA7 |
| 155 | + MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNlcnZpY2VzMQww |
| 156 | + CgYDVQQDEwNXUjIwHhcNMjUwNzA3MDgzNTU0WhcNMjUwOTI5MDgzNTUzWjAZMRcw |
| 157 | + FQYDVQQDEw53d3cuZ29vZ2xlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA |
| 158 | + BFmUG28uSHjAsoydiumyqhnoajtKYozAT/X65vdUpoAPSXIfQw1DCKViQYulxD/g |
| 159 | + OvCehyBe1N9yPltsjVc+h4ujggJAMIICPDAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0l |
| 160 | + BAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUiH5egx0TI4Ua |
| 161 | + sEH2WJrxdEF8gBEwHwYDVR0jBBgwFoAU3hse7XkV1D43JMMhu+w0OW1CsjAwWAYI |
| 162 | + KwYBBQUHAQEETDBKMCEGCCsGAQUFBzABhhVodHRwOi8vby5wa2kuZ29vZy93cjIw |
| 163 | + JQYIKwYBBQUHMAKGGWh0dHA6Ly9pLnBraS5nb29nL3dyMi5jcnQwGQYDVR0RBBIw |
| 164 | + EIIOd3d3Lmdvb2dsZS5jb20wEwYDVR0gBAwwCjAIBgZngQwBAgEwNgYDVR0fBC8w |
| 165 | + LTAroCmgJ4YlaHR0cDovL2MucGtpLmdvb2cvd3IyL29CRllZYWh6Z1ZJLmNybDCC |
| 166 | + AQMGCisGAQQB1nkCBAIEgfQEgfEA7wB2ABLxTjS9U3JMhAYZw48/ehP457Vih4ic |
| 167 | + bTAFhOvlhiY6AAABl+Q9944AAAQDAEcwRQIgNMV+Fyvcr8rZZ0OvGOp0XCYKOulz |
| 168 | + 9XF9tj85yuDUdh4CIQDK1tH0LtM8oNxpm6/C2/C1+ROIBwTNuH5yuy1TPPitLQB1 |
| 169 | + AH1ZHhLheCp7HGFnfF79+NCHXBSgTpWeuQMv2Q6MLnm4AAABl+Q9+5kAAAQDAEYw |
| 170 | + RAIgQCJu1pJLtphnMFc8XjahvFzg8vXAVwaciYiDqh67wFQCIG8JlXQ9j0muZe2O |
| 171 | + 0lefKSAgVv2sUemqoEovPbjLy5uPMA0GCSqGSIb3DQEBCwUAA4IBAQByr/DYf3Xo |
| 172 | + tsnfDqmdZHC4y7K8XoB8+2wfIS18VCm/sxcgXqgjzn7m5WCxDozE4Jv0OhOvaARq |
| 173 | + IJMVDndWu2BEoZE2Xc9nKKvLxj9Lv8dLvdHDSwWqIGp1HlOy+1o4U5/inG3FSxY2 |
| 174 | + /VfM8uobBRMIQLakyMt4YWUU05j+srElxHBgThSlWFlB4/W7nkhR3eBNyWXNw5t9 |
| 175 | + GOO4VDp3X7V85R1fJ/qG/N57LSXLsaC4MajvWOobskqMPlZadhwHbwPcX77l7LT9 |
| 176 | + szAUorBmGkWg7wbZL817rAxWCQW83Fzbgkv5pSBcO3R4r4Pz4Eq7Js6zOXatFGx+ |
| 177 | + Ddy8ixB59aM5 |
| 178 | + -----END CERTIFICATE----- |
| 179 | + 1 s:C=US, O=Google Trust Services, CN=WR2 |
| 180 | + i:C=US, O=Google Trust Services LLC, CN=GTS Root R1 |
| 181 | + a:PKEY: RSA, 2048 (bit); sigalg: sha256WithRSAEncryption |
| 182 | + v:NotBefore: Dec 13 09:00:00 2023 GMT; NotAfter: Feb 20 14:00:00 2029 GMT |
| 183 | + -----BEGIN CERTIFICATE----- |
| 184 | + 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 |
| 211 | + -----END CERTIFICATE----- |
| 212 | + 2 s:C=US, O=Google Trust Services LLC, CN=GTS Root R1 |
| 213 | + i:C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA |
| 214 | + a:PKEY: RSA, 4096 (bit); sigalg: sha256WithRSAEncryption |
| 215 | + v:NotBefore: Jun 19 00:00:42 2020 GMT; NotAfter: Jan 28 00:00:42 2028 GMT |
| 216 | + -----BEGIN CERTIFICATE----- |
| 217 | + MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBX |
| 218 | + MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UE |
| 219 | + CxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYx |
| 220 | + OTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoT |
| 221 | + GUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIx |
| 222 | + MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63 |
| 223 | + ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwS |
| 224 | + iV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351k |
| 225 | + KSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZ |
| 226 | + DrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zk |
| 227 | + j5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5 |
| 228 | + cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esW |
| 229 | + CruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499 |
| 230 | + iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35Ei |
| 231 | + Eua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbap |
| 232 | + sZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b |
| 233 | + 9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAP |
| 234 | + BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAf |
| 235 | + BgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIw |
| 236 | + JQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUH |
| 237 | + MAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6Al |
| 238 | + oCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAy |
| 239 | + MAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIF |
| 240 | + AwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9 |
| 241 | + NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9 |
| 242 | + WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw |
| 243 | + 9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy |
| 244 | + +qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvi |
| 245 | + d0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8= |
| 246 | + -----END CERTIFICATE----- |
| 247 | + """.trimIndent().toTestCase() |
| 248 | + } |
| 249 | + } |
| 250 | +} |
0 commit comments