lib/testkeys/testkeys.go (275 lines of code) (raw):

// Copyright 2019 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package testkeys provides private/public RSA keys for testing. package testkeys import ( "crypto/rsa" "crypto/x509" "encoding/pem" "fmt" ) // Key is a pair of RSA private/public keys. type Key struct { ID string Private *rsa.PrivateKey Public *rsa.PublicKey PrivateStr string PublicStr string } // Component identifies a component in the GA4GH Passport ecosystem. type Component string const ( // Unknown is an unkown component. Unknown Component = "testkeys-unknown" // VisaIssuer0 is a Visa Issuer. VisaIssuer0 Component = "testkeys-visa-issuer-0" // VisaIssuer1 is a Visa Issuer. VisaIssuer1 Component = "testkeys-visa-issuer-1" // PassportBroker0 is a Passport Broker. PassportBroker0 Component = "testkeys-passport-broker-0" // PassportBroker1 is a Passport Broker. PassportBroker1 Component = "testkeys-passport-broker-1" // PersonaBroker is a Passport Broker/Visa Issuer for Personas. PersonaBroker Component = "testkeys-persona-broker" ) // Keys contains fake keys. var Keys = map[Component]Key{ Unknown: keyFromPEM(pems[0], Unknown), VisaIssuer0: keyFromPEM(pems[1], VisaIssuer0), VisaIssuer1: keyFromPEM(pems[2], VisaIssuer1), PassportBroker0: keyFromPEM(pems[3], PassportBroker0), PassportBroker1: keyFromPEM(pems[4], PassportBroker1), PersonaBroker: keyFromPEM(pems[5], PersonaBroker), } var ( // Default is a fake RSA private/public key pair. Default = Keys[Unknown] // PersonaBrokerKey provides Persona Broker private/public key pair. PersonaBrokerKey = Keys[PersonaBroker] ) type pembytes struct { Private []byte Public []byte } func keyFromPEM(in pembytes, id Component) Key { private, _ := rsaPrivateKeyFromPEM(in.Private) public, _ := rsaPublicKeyFromPEM(in.Public) return Key{ ID: string(id), Private: private, Public: public, PrivateStr: string(in.Private), PublicStr: string(in.Public), } } var pems = []pembytes{ { Private: []byte(`-----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgFPmZrJ9Up2nBGIuXl6wTU+4RsUbpz0nRhPiFk3veAofJ9YZLXbU IJSifyUr8shM1Jtld8ZMMA2qzXvCV5zBVqR22Neuzwq0O7b6Yim4N4abULp7m6g/ DUpEsvsDjM3tI7w6VoT4kGjTm2G0R50ojzVz48w9vxClFp9BX/VhvzFlAgMBAAEC gYAmuiRPYW/AG7b3RuYCmSimkq4AD9qrbLR5OxQGl3H2Yhk2R1roDdSYJ0W/N8ES WfyNWlHmM4a+2EePR86/KbM/IdubHftceTBdSMgqoYWO5fRIe4XGVDbDi8RfqpFc ncsoqvwhcqks3l0z3jNLNec8IqineCCtc1tTFdygzIJjBQJBAJOi1FpeWoV4sqWA h6W8WbZcecPhhKYLihBtMqi2LhcRzvZPwlQe+elNT2aOgSVq6gDkmBW3czkb9Ps0 eLzQMwsCQQCRe2oYBarN5qph0RgEYYfE5YHjp2d+Ht9VVhyVOJxFrP+v/A9djBXz 28qhiwcIMKzR6haxEhqDvmzTesiepPNPAkB15wnTiZqdEQEKbxTlZP/4RO3xYv6+ ZGTELZDRb3xrbAtuZc/5wisvCFCqxI+axEFQqT5TyYe5SfxhSUxK7bJ1AkBG7tex 0sGPFxKoEt0U9cDO/eAw8aSCV+cooo3ZK/r19f3M/qc3Q2BIwDeyQCkzkxgQWYSq 3VrUNXq2Oj2rLF39AkEAjoKP8Kh6HuHJnyDyd5vnxsIfMqq+iJVGrrar2vPrgbt0 qKOf8WfauM6oiFVk02YuO5UQL/HfBBV93pq8FKXdng== -----END RSA PRIVATE KEY-----`), Public: []byte(`-----BEGIN PUBLIC KEY----- MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgFPmZrJ9Up2nBGIuXl6wTU+4RsUb pz0nRhPiFk3veAofJ9YZLXbUIJSifyUr8shM1Jtld8ZMMA2qzXvCV5zBVqR22Neu zwq0O7b6Yim4N4abULp7m6g/DUpEsvsDjM3tI7w6VoT4kGjTm2G0R50ojzVz48w9 vxClFp9BX/VhvzFlAgMBAAE= -----END PUBLIC KEY-----`), }, { Private: []byte(`-----BEGIN RSA PRIVATE KEY----- MIICWgIBAAKBgGZ6ZXv/dpmssWUkNkhJfVJgL+c1JLcpv4Y9umEc+/sht1G1Du80 8uXfzsYkHxrZ+kVC5fSop0+bb5Uetq2Cv/Uj8QyapO/oumOa3VfcUsAdtHKCFOqH zScwbyVAvpTQe9FB4ija4jLNGt0p3XKnpswdDZvihOynypKA3RXetuvxAgMBAAEC gYBV7NTBBq/EJNfNbXKSZARPmNUxsQ6rAbdUcNeg6/OgW2HhgcYW7jeoZWN0If9u vUyq3HACF5PKHROPXmRf0hzu9ffpyL+zVJtAwzEwP3TCXRQGnSenYgm34PyMD0P8 g+DtddAjuKhBSRwcG2KF+z51ikiyukrD59o29XU9hr9zvQJBALkuLKBiJXjkKXLu 20A8sX/LPr5zwilc/BO+PB91zS6XujcJBxC6hpcqvcAEyoibwFMdAqwocZVLVCJQ U1ts7Z8CQQCNq195Q5ZIBVkhLAtybZXkY/qZ5BnD7DdEmtLVmVID0cGngz3lgs09 OOshmws0F/+MBlAHaJs+CWJYZkF58ZxvAkBduvVzqLn22uXv+t6XQSFG4gU8OTOJ 5Drjc2LTOblFYB8tRDCDUyZU1Zl92+73/n32k7SKl14Ghz5qr+XBXP1ZAkBsMink bx3jO1Jq5zyG0/LaTxEhXvfejhVXq/bBcysUB6qiyLUJB/C/hSzuqX7Q9lMRGfEc 92M46enWIaJ4A3K5AkAnYoE64xC8UoJtCeXJ/uY/YiNczIX2zbB8qjCJIxWPIwby gW8okA8HOWitOMGS/QbdoYlbyyzbw77GwGqMaWyx -----END RSA PRIVATE KEY-----`), Public: []byte(`-----BEGIN PUBLIC KEY----- MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgGZ6ZXv/dpmssWUkNkhJfVJgL+c1 JLcpv4Y9umEc+/sht1G1Du808uXfzsYkHxrZ+kVC5fSop0+bb5Uetq2Cv/Uj8Qya pO/oumOa3VfcUsAdtHKCFOqHzScwbyVAvpTQe9FB4ija4jLNGt0p3XKnpswdDZvi hOynypKA3RXetuvxAgMBAAE= -----END PUBLIC KEY-----`), }, { Private: []byte(`-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQDwLljNK1EwQT1/71Xfmy6z1LbmC7J5m7TEdv2QeeZZW4mC0LXc G7KvxXOnfzu45zBq5p2Fv6dw7CbQbNaj7bbF9doEnD2sQLA5rB0IrAss+YIv3PN3 437g3UU8L2Sw1UaoRIfuLx9u9TuK1EgeWjSjNgmOrlPp7r8jGizVnec6FQIDAQAB AoGASVYtgUAnwy84gxbmRqeQpBJgYm/R6DX2BUM7+2BtSH2dyFbIINRIRElrHgrI hpX4/7s4//zcOKuy0lNZWqab9tDEEtPl8TNq6qgFaBLVngZa4Z5LfFv/pA3bIBKD ina9osJ0zhlbQUpMOh4jA/V9pQvfb0HF94vC3+YbFK5Qt2ECQQD4fI4vdl027pDw JfTT3TqNnxQ5zS7/5u5ZzvDHRVmmqO4PFyk+9p6mIBHhTEuQBkZPjb2ATtEZlMR9 xUx8hQ15AkEA93GAZ16837eg5JhEhMKxSvWRjDxrxO3GTrbjHD1Qk8tdw/+BjjZD fWK5VNxnFE8A8BkKfVVbIRlihp5HjHFWfQJAESz63wj9dHiVCCR3gdV+4J8oVL58 CzA5NXf6aKvAgKaYne5p6XI+kRkSY1JUvsXQQlt3x9Cq32vLES58FPdVcQJBAIrj 6MEdCkNA3Uyys3MZnU6H/ISMvakyFefE/EGzoPD0a9NCLcRXbRaKPaEGfc2Gcu5R //NN3/L6PrV1To/kZjkCQQD1zGnD59U8YT6ShQ4BtMht8u4rsQRDnK0B5ZoYC2W5 hN0gaHOqt3ZqJrZVR8goLGp9cOCTpyj+Vfvrdr8MiJrg -----END RSA PRIVATE KEY-----`), Public: []byte(`-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDwLljNK1EwQT1/71Xfmy6z1Lbm C7J5m7TEdv2QeeZZW4mC0LXcG7KvxXOnfzu45zBq5p2Fv6dw7CbQbNaj7bbF9doE nD2sQLA5rB0IrAss+YIv3PN3437g3UU8L2Sw1UaoRIfuLx9u9TuK1EgeWjSjNgmO rlPp7r8jGizVnec6FQIDAQAB -----END PUBLIC KEY-----`), }, { Private: []byte(`-----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQCOP7hFgzGGIKSBLnmH2BCNt8CvwGL8thrQ+NKCuTrl+I24V4uF 2fmQRRjfVAPiha4q8CbDJfXTnQVPhXsqWrq5pZMRHhIyCzgWYIvD6WJ+Dqf7l7lP xKet5Dd38L/EiNe/HMc6InBmkQ9J0A6ndpmEAABO3wpoXEzVWx7cOWMkvQIDAQAB AoGAEK4uKJCSzRykzbUqcSCICGZExRc1RFcCXADhhoy7+F2mGLjDVqXR2vYPTZjn f7eXTdetY/Lembru9X08jSHohU/nFlfv0NuTPJZvxXh42sB265bl4YUaQwXIBLxj qFDxlSjJY2Ukfv6QuhleQkzMPVkokvM/YQN8dSE6AUci3Y0CQQD+K8odxNe4avM8 v2AY3xAYatEsN+ku9YcCEC1QUqG6RBMWJcpfTuRupnBv75OnGk7aiV4SAjh6nGEc JW3TJeJnAkEAj0XB9CNaiylWpojeywGSwrd7+RB1149v3iebfmbqn5xc5gARo58n wgPTeeSGzOn3cJ5HLxcrJ+T/1RJ2/TPxOwJBAPYrjzw50/0HiMIDUJ2GHd6oRiMf m7chkjsLU/gBsCXpnNrMiy64CEKq7Sdc0JL9xfWfKf8jK3SFVQCft7jTbm0CQGdq yQe7BT5yRnPLVFZg+ljHLRupQAarKOrI2DqzeyRfL8dtwU3EMmSfcmUICi2brNqD xYo+RQ51BB3/SBiZB8UCQGLzyWH5il98LpDW8BmKZjkxDmz3yWzA9BEhVLF7HrmA uH5IhS4AE1o6JekYR9PNIYqvNxRL2cIAiZW4S9AUn2s= -----END RSA PRIVATE KEY-----`), Public: []byte(`-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCOP7hFgzGGIKSBLnmH2BCNt8Cv wGL8thrQ+NKCuTrl+I24V4uF2fmQRRjfVAPiha4q8CbDJfXTnQVPhXsqWrq5pZMR HhIyCzgWYIvD6WJ+Dqf7l7lPxKet5Dd38L/EiNe/HMc6InBmkQ9J0A6ndpmEAABO 3wpoXEzVWx7cOWMkvQIDAQAB -----END PUBLIC KEY-----`), }, { Private: []byte(`-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQCYCwIr2VWKLmOriOmL0FUNUvig2ib+6r6/C7z019oH/vC+XhRL mT0Y9TRK6qlYEs8iYoVRGW8fkNRhNk6uWbJJDx406eNGNA0DH+mMOvkhVsDjsgIM WJi8kk0X7WpRpGCBAGd/AhYUWYpUEvWWgQanwIdLTjnruG6yRP4OmINihQIDAQAB AoGACFvak7SQGlewjRaq2E/szR25o4Y6zJr1P6WSjtdrGjNu4thjP0C+difM5y19 f+UQ1DAcajf+vvqEYo/MxZMS1RGhcDF8cuwFXbbkdu264jZ3+cinvltlu7koiNXg S+DP9i4Br3TF+XDAf/osWAsBAIF0vm5soWXj6f3WVRt8BIUCQQDYdJy/9urSArNI S6VKKV4QUX8Duw46vVrPMKGgZ4o+eWZ/9W9XvatnSTmQFEmhVXFO++GQs5XQ35oS 1cqtMh+zAkEAs9HksSkTzOHCkpzZWx5Zqr882MzIUgCs8Vj/r58cTB9OXzPtz+a2 Mvyg9vTAzkgFB6jWJ1EPK78iTY9vxXAY5wJBAJBUOUza5LrB6C91mTI5ISp6XNns +VD7f7iVccAWKhz8L/d0fRihNNA7CDHlBS+ZXGNRGpe011meLwsOGQWhXXcCQHvN ebdjgadgk7afWKJ8Xd3J9pmJPC4BGxC7ZqZCVJgwQaQYO5YU0MJ/3k7Iqeob+aKR YogFLf2/hV2C8MAtcmcCQQClYiiihHONOv09CfxVN/vJCZxj4Id8TxRFYsMj3/qP pKzQY34zsRspXN9cGait5la41EmRdk23H6ddTLlmOtGt -----END RSA PRIVATE KEY-----`), Public: []byte(`-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYCwIr2VWKLmOriOmL0FUNUvig 2ib+6r6/C7z019oH/vC+XhRLmT0Y9TRK6qlYEs8iYoVRGW8fkNRhNk6uWbJJDx40 6eNGNA0DH+mMOvkhVsDjsgIMWJi8kk0X7WpRpGCBAGd/AhYUWYpUEvWWgQanwIdL TjnruG6yRP4OmINihQIDAQAB -----END PUBLIC KEY-----`), }, { Private: []byte(`-----BEGIN RSA PRIVATE KEY----- MIICWgIBAAKBgGmT42puFENUNvSBdJXRVV11p6UsuUjgtlKGDVouVxEi6aEgPRmb 7/P+KJPQaYwohscxl0vXYDQz2vZMznjM4nJML4pm2/FrOqkfChUzlU3Vb1RDkuqD 0QTTnLt4aOw8GuOO0oqkC+5vLXlwVNBboLGTHXwGFuIoWKw0eND8MonTAgMBAAEC gYBDKTqvx5rIQdg7reZWL7YYH/InVs3/GEOjN3di+LuWQRlR0EpN8i6wjeuOLDQY Xudt65QNQNMIIjyWFcH6gotBzDsccrgRpHYwyaC644ozBnmGHs5kb3M0lhxuCJ+f rpw3qiBpGacYmzZbxPm46rj4/oCFC2jh+OW2m+YqiWP2sQJBALRJaavOcNTVUL/j 9BMNj/97m2MRcatGOPmaLpi4BrXYR6nyTnq94MepSmpY5xRHewFL4RFFR12boIon HByvHGcCQQCV6oU0HeuA8RjBrvAciD3Zm8LY42gIsttqfbqjmgCwWSSkaW6i6U9I ZKPFlb7IhaK+tZH91WQa/13dgItHl8O1AkBYLjwwW4YWo8ueP+nm09Bl3tiO6T5W zr8ZXs+BxSkLEqFiv3ChWnQyVFxgjeFgquHALZQFNYSFhZRNXnnCkefrAkBh1iWM N6KECdQQQqys0jUbGM32YaJ5WtBbFSaCsnSUofiJ28y6QOze398JiYpyrtPhBfn6 4BJulA2cCtHarS6pAkB+rBcsL5EmymwUk0KUlMYBNMRh2rkz4hSeML0i5/NCr1ck d2T5FipnEC+9V0Xtmvb4/zuMv0gzI0WG+2hJOaGo -----END RSA PRIVATE KEY-----`), Public: []byte(`-----BEGIN PUBLIC KEY----- MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgGmT42puFENUNvSBdJXRVV11p6Us uUjgtlKGDVouVxEi6aEgPRmb7/P+KJPQaYwohscxl0vXYDQz2vZMznjM4nJML4pm 2/FrOqkfChUzlU3Vb1RDkuqD0QTTnLt4aOw8GuOO0oqkC+5vLXlwVNBboLGTHXwG FuIoWKw0eND8MonTAgMBAAE= -----END PUBLIC KEY-----`), }, { Private: []byte(`-----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgHswVrcmyu7d1NKn54T6mfY6m//asi9pDJm+grG+C+eMQ9j40j97 0URKipEmKrfIH/iyAi17JtY7SlTuGCSqgyTMNFS8ZdUZqmHM1gRr/qTSS2FiUaKP sLJl2/F35i2ZZMm0rWOkmffRwEEuNuHqLBfAB+nGFU4nz1Tt5twdElFVAgMBAAEC gYAKEU1E8pqrIt39yVMWfxSOFwQgyNK/JSqude9gb1OxvLjexpcIMSpNFnp0mlXr ZyOVw5aB+QqXf4j3n+3BMV4+Sna9Rmio/cSSSfWWwbq54NH+28pNRRFGOrKh4OxI bbkRHIQ0EQ3lhGaVwnM3ER0VnbTAx46jSSxDFV65dBZrgQJBAMQUWkSdQed5FoQ3 2IIx2J1jgp8TT5ZkIbMMvoTeNzY3sVjpMVrpsycKVYuiWLFs4+cBdgo6WZbVJajN 7ptqoRkCQQCg1Z5zrRKaH7O+A0aFWw9Vy8ftDtvk6V9fmgV3zZXu3NolmPXP/97Y ZkiAsYYlnvPblq4H+cq0j0xxjsFmIU2dAkAvFJP4FapVYgW+CYq6+C0C3XnnqENb 4P8WduDoFlM7eXPj3Vo0chjKLvkLZhfVwkeWmAs3uXr5dIRuW8QHHTtBAkBqlOWK NrlLFZMhaj5DhVKmQoLcn6otClI/omvZNo4TWpvdqn3LNv7QXQfS8NG7AJkNfc8a Tfh8qzG3Vyjmq08pAkEAoZnOJYOjj04SVb9gf9xquz9gP/m5UQvrgJzkD+K8NWTD d2mZMaqRL8iuCnjKxYPEb2jjGqbEt0vVXXHw+zwwDA== -----END RSA PRIVATE KEY-----`), Public: []byte(`-----BEGIN PUBLIC KEY----- MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHswVrcmyu7d1NKn54T6mfY6m//a si9pDJm+grG+C+eMQ9j40j970URKipEmKrfIH/iyAi17JtY7SlTuGCSqgyTMNFS8 ZdUZqmHM1gRr/qTSS2FiUaKPsLJl2/F35i2ZZMm0rWOkmffRwEEuNuHqLBfAB+nG FU4nz1Tt5twdElFVAgMBAAE= -----END PUBLIC KEY-----`), }, { Private: []byte(`-----BEGIN RSA PRIVATE KEY----- MIICWgIBAAKBgEXBhVYMfFNEjiLbRUXW5AU2dyZJ5kkL8T1XRTUIHjLI/e6Wfqve TaD3ziVFXIijFIoesVrl/apDQDNdQDxaX+q5UAnzlu9tryYxzGZhKWz+sxgjzaZx pYq5kQF5wglHgmYnYA2K/09gZ4UsbIrtYc+wib+E4v3UL5atzMY4e90rAgMBAAEC gYArFf1lyRCB3jZtEUMYgEMXdSzjWYIEXHwFh4IX34vHkp5GYG6dehI4+tc57j3Z p+Fn7s1dd/HW2PMuxsqGfMwBapik/wBpthTFGTbpmSpmPvfFkRUBwi6/NE2WAdPh wTtmhdcOSDYH91N606rwLVgJLC6fEVzrM8KRp1bETHi0AQJBAIgmu9HH5B1ppzvZ ia6K/47J45yGCT+16LGl1xyzA2esQdDGFF3lfajQhJHHK/orFSlnHUbkhEFpXeOC H0Ap7XsCQQCDKM1GM5FX+KAPrNLh2OqlWX4ivENl11buipGtij6bc/FVMz5kUi22 M7m6lY/FOTeRGne+hn2D6gHihd+dEcgRAkAjZ38btBEbnOfB5nWpD7gY12L6xtgM 2y7hUzC2484U3XRX58pQCGc+yMpQZiyHZ0CffZLdZnsFz3J8wM+DjeOVAkAd4zBT rPCT0U34BHPRjzJ5F1mM5MWe8WEX3m+v0e7OUa9OsOyow6ky+bp68BXg5VbqM9PR kKgNZUekrMj169VhAkBOQmONQQOEKPLomlFuRZavTmmf3t+D8NXL4ZWviIUn77Ov t5AtQckM9uwoBXdM2dLl4CNIUPG0KJlu8Zy4Ju1o -----END RSA PRIVATE KEY-----`), Public: []byte(`-----BEGIN PUBLIC KEY----- MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgEXBhVYMfFNEjiLbRUXW5AU2dyZJ 5kkL8T1XRTUIHjLI/e6WfqveTaD3ziVFXIijFIoesVrl/apDQDNdQDxaX+q5UAnz lu9tryYxzGZhKWz+sxgjzaZxpYq5kQF5wglHgmYnYA2K/09gZ4UsbIrtYc+wib+E 4v3UL5atzMY4e90rAgMBAAE= -----END PUBLIC KEY-----`), }, { Private: []byte(`-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQCxAlaaehxobau/ewj+Ghe0vXpOnYJKcUsUVoTTminpqfi9kXQ2 daFaDuXbMG2URqNVd7vKUYjnSmDKmcMQZt/84U0GgKex2izt7SAuO5QQzeBeabom BWbIeE1/msTFeZ1iOO/FIoUyiTuEsZNMw6CAdi0b7ybWjEDuvr7QzWJV3QIDAQAB AoGBAJ6Y2b/PaWSn3xrRwlzqRBNNMij+N587o2m1m418s9EI2jX//YBOJSPr9UdP PN996xrJDRlZtLCHk/HzkzM++bC3aY7rc/TsR72yWg50jhUJ02Li9UR9ZwSng54a UovDS5fL1PFK1wPOsIZM8WhUVcq40kGHcMOucwqALxn10caBAkEA/WBxyvjqOn99 pcIoS6OwXnPRjjqcCgDNkWaT2o68CaA/hco8olAL/vjSUvoqlIgym2io1vhFo41k YNVIMud61wJBALLXfMMQJ+JgqjN0D+sSPFZqQz0MsK8tDR1GUijpAEYsc1+qFG4J AG3Z+RyldQcQWy8LWFYLXHTy6JdrBiP8MmsCQAplZ6XdWrb1vjEL611XJQhrFiEQ 1JAwgj7CB7UDAEIg2hpiNuSuBh/7E54l95NKl1D7FVpkq27PgVvbxG+aQdcCQBwj 2/W1bREptJ4z/O04CVZvkfThMkveAtpAXl0hjHF+PQkocd5+fBrM2W2weyGJaU+V sWiYkQu1zPNGW8j9vdECQQCvPaTzxOoyT3U76EpmSdTsU0gYGXbhpnlk8TFrQDZa Dq7OeI/9BspyLxrJk7JeMoqUUQA103nbi+MoDuE9cBG0 -----END RSA PRIVATE KEY-----`), Public: []byte(`-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxAlaaehxobau/ewj+Ghe0vXpO nYJKcUsUVoTTminpqfi9kXQ2daFaDuXbMG2URqNVd7vKUYjnSmDKmcMQZt/84U0G gKex2izt7SAuO5QQzeBeabomBWbIeE1/msTFeZ1iOO/FIoUyiTuEsZNMw6CAdi0b 7ybWjEDuvr7QzWJV3QIDAQAB -----END PUBLIC KEY-----`), }, } func rsaPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error) { block, _ := pem.Decode(key) return x509.ParsePKCS1PrivateKey(block.Bytes) } func rsaPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error) { block, _ := pem.Decode(key) parsed, err := x509.ParsePKIXPublicKey(block.Bytes) if err != nil { return nil, err } pub, ok := parsed.(*rsa.PublicKey) if !ok { return nil, fmt.Errorf("key type is wrong") } return pub, nil }