github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/pkg/cert/certutils_test.go (about) 1 package cert_test 2 3 import ( 4 "encoding/base64" 5 "testing" 6 7 "github.com/kyma-incubator/compass/components/director/pkg/cert" 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 ) 11 12 func TestSubjectExtraction(t *testing.T) { 13 testCases := []struct { 14 subject string 15 orgUnitPattern string 16 orgRegionPattern string 17 country string 18 locality string 19 province string 20 org string 21 orgUnit string 22 orgUnits []string 23 uuidOrgUnit string 24 remainingOrgUnit string 25 commonName string 26 }{ 27 { 28 subject: "CN=application,OU=SAP Cloud Platform Clients,OU=OrgUnit2,OU=123e4567-e89b-12d3-a456-426614174001,O=Org,L=Waldorf,ST=Waldorf,C=DE", 29 orgUnitPattern: "SAP Cloud Platform Clients", 30 orgRegionPattern: "OrgUnit2", 31 country: "DE", 32 locality: "Waldorf", 33 province: "Waldorf", 34 org: "Org", 35 orgUnit: "SAP Cloud Platform Clients", 36 orgUnits: []string{"SAP Cloud Platform Clients", "OrgUnit2", "123e4567-e89b-12d3-a456-426614174001"}, 37 uuidOrgUnit: "123e4567-e89b-12d3-a456-426614174001", 38 remainingOrgUnit: "123e4567-e89b-12d3-a456-426614174001", 39 commonName: "application", 40 }, 41 { 42 subject: "CN=application,OU=SAP Cloud Platform Clients,OU=123e4567-e89b-12d3-a456-426614174001,O=Org,L=Waldorf,ST=Waldorf,C=DE", 43 orgUnitPattern: "SAP Cloud Platform Clients", 44 country: "DE", 45 locality: "Waldorf", 46 province: "Waldorf", 47 org: "Org", 48 orgUnit: "SAP Cloud Platform Clients", 49 orgUnits: []string{"SAP Cloud Platform Clients", "123e4567-e89b-12d3-a456-426614174001"}, 50 uuidOrgUnit: "123e4567-e89b-12d3-a456-426614174001", 51 remainingOrgUnit: "123e4567-e89b-12d3-a456-426614174001", 52 commonName: "application", 53 }, 54 { 55 subject: "CN=application,OU=SAP Cloud Platform Clients,OU=123e4567-e89b-12d3-a456-426614174001,O=Org,L=Waldorf,ST=Waldorf,C=DE", 56 orgUnitPattern: "SAP Cloud Platform Clients", 57 orgRegionPattern: "OrgUnit2", 58 country: "DE", 59 locality: "Waldorf", 60 province: "Waldorf", 61 org: "Org", 62 orgUnit: "SAP Cloud Platform Clients", 63 orgUnits: []string{"SAP Cloud Platform Clients", "123e4567-e89b-12d3-a456-426614174001"}, 64 uuidOrgUnit: "123e4567-e89b-12d3-a456-426614174001", 65 remainingOrgUnit: "123e4567-e89b-12d3-a456-426614174001", 66 commonName: "application", 67 }, 68 { 69 subject: "CN=application,OU=SAP Cloud Platform Clients,OU=OrgUnit2,OU=RemainingOrgUnit,O=Org,L=Waldorf,ST=Waldorf,C=DE", 70 orgUnitPattern: "SAP Cloud Platform Clients", 71 orgRegionPattern: "OrgUnit2", 72 country: "DE", 73 locality: "Waldorf", 74 province: "Waldorf", 75 org: "Org", 76 orgUnit: "SAP Cloud Platform Clients", 77 orgUnits: []string{"SAP Cloud Platform Clients", "OrgUnit2", "RemainingOrgUnit"}, 78 uuidOrgUnit: "", 79 remainingOrgUnit: "RemainingOrgUnit", 80 commonName: "application", 81 }, 82 { 83 subject: "CN=application,OU=SAP Cloud Platform Clients,OU=OrgUnit2,OU=RemainingOrgUnit,OU=RemainingOrgUnit2,O=Org,L=Waldorf,ST=Waldorf,C=DE", 84 orgUnitPattern: "SAP Cloud Platform Clients", 85 orgRegionPattern: "OrgUnit2", 86 country: "DE", 87 locality: "Waldorf", 88 province: "Waldorf", 89 org: "Org", 90 orgUnit: "SAP Cloud Platform Clients", 91 orgUnits: []string{"SAP Cloud Platform Clients", "OrgUnit2", "RemainingOrgUnit", "RemainingOrgUnit2"}, 92 uuidOrgUnit: "", 93 remainingOrgUnit: "", 94 commonName: "application", 95 }, 96 { 97 subject: "CN=,OU=,O=,L=,ST=,C=", 98 orgUnitPattern: "(SAP Cloud Platform Clients|OrgUnit2|OrgUnit3)|OrgUnit4", 99 country: "", 100 locality: "", 101 province: "", 102 org: "", 103 orgUnit: "", 104 orgUnits: []string{}, 105 commonName: "", 106 }, 107 { 108 subject: "CN=,OU=,O=,L=,ST=,C=", 109 country: "", 110 locality: "", 111 province: "", 112 org: "", 113 orgUnit: "", 114 orgUnits: []string{}, 115 commonName: "", 116 }, 117 } 118 119 for _, testCase := range testCases { 120 t.Run("should extract subject values from subject: "+testCase.subject, func(t *testing.T) { 121 assert.Equal(t, testCase.country, cert.GetCountry(testCase.subject)) 122 assert.Equal(t, testCase.locality, cert.GetLocality(testCase.subject)) 123 assert.Equal(t, testCase.province, cert.GetProvince(testCase.subject)) 124 assert.Equal(t, testCase.org, cert.GetOrganization(testCase.subject)) 125 assert.Equal(t, testCase.orgUnit, cert.GetOrganizationalUnit(testCase.subject)) 126 assert.Equal(t, testCase.orgUnits, cert.GetAllOrganizationalUnits(testCase.subject)) 127 assert.Equal(t, testCase.uuidOrgUnit, cert.GetUUIDOrganizationalUnit(testCase.subject)) 128 assert.Equal(t, testCase.remainingOrgUnit, cert.GetRemainingOrganizationalUnit(testCase.orgUnitPattern, testCase.orgRegionPattern)(testCase.subject)) 129 assert.Equal(t, testCase.commonName, cert.GetCommonName(testCase.subject)) 130 }) 131 } 132 } 133 134 func TestParseCertificate(t *testing.T) { 135 const certificate = "-----BEGIN CERTIFICATE-----\nMIIDbjCCAlYCCQDg7pmtw8dIVTANBgkqhkiG9w0BAQsFADB5MQswCQYDVQQGEwJC\nRzENMAsGA1UECAwEVGVzdDENMAsGA1UEBwwEVGVzdDENMAsGA1UECgwEVGVzdDEN\nMAsGA1UECwwEVGVzdDENMAsGA1UEAwwEVGVzdDEfMB0GCSqGSIb3DQEJARYQdGVz\ndEBleGFtcGxlLmNvbTAeFw0yMjAxMjQxMTM4MDFaFw0zMjAxMjIxMTM4MDFaMHkx\nCzAJBgNVBAYTAkJHMQ0wCwYDVQQIDARUZXN0MQ0wCwYDVQQHDARUZXN0MQ0wCwYD\nVQQKDARUZXN0MQ0wCwYDVQQLDARUZXN0MQ0wCwYDVQQDDARUZXN0MR8wHQYJKoZI\nhvcNAQkBFhB0ZXN0QGV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEAuiFt98GUVTDSCHsOlBcblvUB/02uEmsalsG+DKEufzIVrp4DCxsA\nEsIN85Ywkd1Fsl0vwg9+3ibQlf1XtyXqJ6/jwm2zFdJPM3u2JfGGiiQpscHYp5hS\nlVscBjxZh1CQMKeBXltDsD64EV+XgHGN1aaw9mWKb6iSKsHLhBz594jYMFCnP3wH\nw9/hm6zBAhoF4Xr6UMOp4ZzzY8nzLCGPQuQ9UGp4lyAethrBpsqI6zAxjPKlqhmx\nL3591wkQgTzuL9th54yLEmyEvPTE26ONJBKylH2BqbAFiZPrwet0+PRJSflAfMU8\nYHqqo2AkaY1lmMAZiKDhj1RxMe/jt3HmVQIDAQABMA0GCSqGSIb3DQEBCwUAA4IB\nAQBx8BRhJ59UA3JDL+FHNKwIpxFewxjJwIGWqJTsOh4+rjPK3QeSnF0vt4cnLrCY\n+FLuhhUdFxjeFqJtWN7tHDK3ywSn/yZQTD5Nwcy/F1RmLjl91hjudxO/VewznOlq\nHJlDoM7kW9kOG6xS2HbbSaC1CzU33E90QOwcyCoeVXJ8aMDe6v/kWC65RoI9evg5\n2OxoARA8fpjyUphMTXuVNVI1kd2Uskpo8PePbc1h3OJVzYPIQ4+qMGsu7n3ZdwzI\nqDs2kdBD77k6cBQS+n7g5ETwv5OAgl5q1O17ye/YFNA/T3FhL9to6Nmrkqt7rlnF\nL8uAkeTGuHEATjmosQWUmbYi\n-----END CERTIFICATE-----\n" 136 const key = "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAuiFt98GUVTDSCHsOlBcblvUB/02uEmsalsG+DKEufzIVrp4D\nCxsAEsIN85Ywkd1Fsl0vwg9+3ibQlf1XtyXqJ6/jwm2zFdJPM3u2JfGGiiQpscHY\np5hSlVscBjxZh1CQMKeBXltDsD64EV+XgHGN1aaw9mWKb6iSKsHLhBz594jYMFCn\nP3wHw9/hm6zBAhoF4Xr6UMOp4ZzzY8nzLCGPQuQ9UGp4lyAethrBpsqI6zAxjPKl\nqhmxL3591wkQgTzuL9th54yLEmyEvPTE26ONJBKylH2BqbAFiZPrwet0+PRJSflA\nfMU8YHqqo2AkaY1lmMAZiKDhj1RxMe/jt3HmVQIDAQABAoIBAH+9xa0N6/FzqhIr\n8ltsaID38cD33QnC++KPYRFl5XViOEM5KrmKdEhragvM/dR92gGJtucmn1lzph/q\nWTLXEJbgPh4ID6pgRf79Xos38bAJFZxrf3e2MKdUei1FaeRWRD9AFqddV100DjvO\nMTnztPX2iujv00zCkl5J1pT7FgrtcYgDPxXQK7dIcHrc9bV9fdTQUnpbVIs/9U7a\n7Qk/eJnEkezbjQCk7+Pgt3ymR29s4vJvyPen3jek0FKhQCxAg6iA5ZOtY+J5AS9e\n3ozZLUEa3b0eOABMw8QnKMtGTmIhLbf9JhISK2Ltsisc/yHHH3KfFE2nayqjvLZf\n5GR62hkCgYEA612EgoRHg4+BSfPfLNG3xsSnM+a98nZOmyxgZ3eNFWpSvi+7MemL\nCJHpwwje412OU1wCc2MtWYvGFY+heL62FxT8+JJLntykZcTQzQoHX3wvaMwopWRi\nJdrv3tEDtSJo9za54kfrNqnVyaxu82r7zgxVbcNiAVR+n7cRXuov288CgYEAynLm\nVI7cIKBOM6U44unkKyIS99Bh57FPjE1QAIsEOiNCWZay4qmzdEboOXjtC95Qyyxn\nTb+MONybwXKkGiLZQZQ2SlgjtEMBDQ+ofk2fK+yHWf4VeLtYWJdBESaAz85xGCCY\nYqlqbFEQd8cl86gTne+emLXp8KrDMuXhbbPvMJsCgYEAgBISAacS9t6GfoQqA0xW\nkNz/EnnTD/UaTst15bci2O1S+tQkK0OmeNJU/eB80AFfabKeTsU/rwMklSTjuz0i\n/ipYgLWyWk47UnknGPsFCgscDQ1SbLTTxz972KWpO83uid6IhT2XGtaNU0D12pRz\nUipZ7fEsCgc9I5FM7XXG9vcCgYBp6xN2ygeBSl2fx6GrlpM5veoOnYeboLjtvsVM\ng28Cu8/K731H+WFaRH7bEtlyjC3ZHrItiznhxgn3e/M/eVwRY2nEG7kSZrv2CWsu\nKY5NfMKT4st5Dwt5zijMwEhEcM3awbL4a4qygPcMs7S3dghNaUCgxQxQTgcyafM3\nYhySYQKBgF7pqQW7ESo1Mp9by+HzJBJsSju5zPBrCZrx8rFAMLCk1uDAIRcUuQtq\n+YwKU8ViemkOHWfN6bePap3/kdVHUxj2xJ6xTAUYHpVOQVMhTw1UmOikiV4FwUo+\nGb5Nk5evWBGhsl2LFqoOqhvFpjftv8+qgRHxmWtj4EoJYWng+hRz\n-----END RSA PRIVATE KEY-----\n" 137 138 t.Run("non-base64-encoded-cert", func(t *testing.T) { 139 _, err := cert.ParseCertificate(certificate, key) 140 require.NoError(t, err, "failed to parse certificate") 141 }) 142 143 t.Run("base64-encoded-cert", func(t *testing.T) { 144 base64EncodedCert := base64.StdEncoding.EncodeToString([]byte(certificate)) 145 base64EncodedKey := base64.StdEncoding.EncodeToString([]byte(key)) 146 147 _, err := cert.ParseCertificate(base64EncodedCert, base64EncodedKey) 148 require.NoError(t, err, "failed to parse certificate") 149 }) 150 }