github.com/aporeto-inc/trireme-lib@v10.358.0+incompatible/controller/pkg/usertokens/pkitokens/publickeys_test.go (about)

     1  // +build !windows
     2  
     3  package pkitokens
     4  
     5  import (
     6  	"crypto/ecdsa"
     7  	"crypto/rsa"
     8  	"testing"
     9  
    10  	. "github.com/smartystreets/goconvey/convey"
    11  )
    12  
    13  func TestParsePublicKeysFromPEM(t *testing.T) {
    14  
    15  	Convey("Given a PEM with a PKIX RSA public key, a PKCS#1 RSA public key and an X509 certificate", t, func() {
    16  		pemBytes := []byte(`
    17  -----BEGIN PUBLIC KEY-----
    18  MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyjDEPJD1Fv1IJIq4mnec
    19  oMlSve0vZOTuzDmKuMB4vfBXalKZgbp4ONL+BvWV9OPs22Smv9SAfnoQ25q8Q9so
    20  ihzUKhaIAY2CI70ll4exbLK9FD4uTi1bqn0FdIh04UIyW6s2EqTGMkSKx9THNvAM
    21  Kx++pPt3US2sQVEC24bWPxRN7RsBBpRjoiEamkA04ioGFhMBbas5MdCLt/fd92aR
    22  QCBISOb6PU08fQiARK8g/wdpBUTxy9/Ud1vUnNaZtWm+eLrwdTXgHM3/LG1M4lc0
    23  ZqHIL3rMxhae5W+j3SL3ApreiUYugv/0bCSypvJZjEXKS7SBR/+rtw0/mQpS8DpI
    24  kwIDAQAB
    25  -----END PUBLIC KEY-----
    26  -----BEGIN RSA PUBLIC KEY-----
    27  MIIBCgKCAQEAyjDEPJD1Fv1IJIq4mnecoMlSve0vZOTuzDmKuMB4vfBXalKZgbp4
    28  ONL+BvWV9OPs22Smv9SAfnoQ25q8Q9soihzUKhaIAY2CI70ll4exbLK9FD4uTi1b
    29  qn0FdIh04UIyW6s2EqTGMkSKx9THNvAMKx++pPt3US2sQVEC24bWPxRN7RsBBpRj
    30  oiEamkA04ioGFhMBbas5MdCLt/fd92aRQCBISOb6PU08fQiARK8g/wdpBUTxy9/U
    31  d1vUnNaZtWm+eLrwdTXgHM3/LG1M4lc0ZqHIL3rMxhae5W+j3SL3ApreiUYugv/0
    32  bCSypvJZjEXKS7SBR/+rtw0/mQpS8DpIkwIDAQAB
    33  -----END RSA PUBLIC KEY-----
    34  -----BEGIN CERTIFICATE-----
    35  MIIDazCCAlOgAwIBAgIUTBdVdOoTt+z1c+25X1WdKLEqc/IwDQYJKoZIhvcNAQEL
    36  BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
    37  GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xOTAxMzEwNTE4MDVaFw0yOTAx
    38  MjgwNTE4MDVaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
    39  HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
    40  AQUAA4IBDwAwggEKAoIBAQDKMMQ8kPUW/Ugkiriad5ygyVK97S9k5O7MOYq4wHi9
    41  8FdqUpmBung40v4G9ZX04+zbZKa/1IB+ehDbmrxD2yiKHNQqFogBjYIjvSWXh7Fs
    42  sr0UPi5OLVuqfQV0iHThQjJbqzYSpMYyRIrH1Mc28AwrH76k+3dRLaxBUQLbhtY/
    43  FE3tGwEGlGOiIRqaQDTiKgYWEwFtqzkx0Iu39933ZpFAIEhI5vo9TTx9CIBEryD/
    44  B2kFRPHL39R3W9Sc1pm1ab54uvB1NeAczf8sbUziVzRmocgveszGFp7lb6PdIvcC
    45  mt6JRi6C//RsJLKm8lmMRcpLtIFH/6u3DT+ZClLwOkiTAgMBAAGjUzBRMB0GA1Ud
    46  DgQWBBRzt5Gi91WRLBU1PRlo/wCC44DNnzAfBgNVHSMEGDAWgBRzt5Gi91WRLBU1
    47  PRlo/wCC44DNnzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAv
    48  +NayVYU//8QX2TIQ5CcH/3iOCOa9Qx4KHYtyv+/ElBm2WaWRbJiy470D/I2tjkO0
    49  J4a0kihMKEkwAVUvskbM+PjTcrgaE205YO/Pyn00s0Xt3yBp2Cf6rmcNtda4hqCs
    50  ZNhCEXxAXbLxGb5oXd+Wis/tzpBNYrw9x9r3Axr9U2pW+sSzXsUqRdBvaHpywIRq
    51  6FnpawXPJMIOaMohmWAPYnmqILUs0CslzmXQypayslAFC2adr1NQPwZw0FJ3UIQM
    52  AyfixuFuZbOVlwm/zJqX0G0NbitPybGV5XneC89OF90H0zfv47Us0akzyY6yGLp/
    53  +3ASkOBz0ypQ6pgZK/kj
    54  -----END CERTIFICATE-----
    55  		`)
    56  
    57  		Convey("then parsePublicKeysFromPEM should return 3 public keys", func() {
    58  			keys, err := parsePublicKeysFromPEM(pemBytes)
    59  			So(err, ShouldBeNil)
    60  			So(len(keys), ShouldEqual, 3)
    61  		})
    62  	})
    63  
    64  	Convey("Given a PEM with an RSA private key and a DSA public key", t, func() {
    65  		pemBytes := []byte(`
    66  -----BEGIN RSA PRIVATE KEY-----
    67  MIIEpAIBAAKCAQEAyjDEPJD1Fv1IJIq4mnecoMlSve0vZOTuzDmKuMB4vfBXalKZ
    68  gbp4ONL+BvWV9OPs22Smv9SAfnoQ25q8Q9soihzUKhaIAY2CI70ll4exbLK9FD4u
    69  Ti1bqn0FdIh04UIyW6s2EqTGMkSKx9THNvAMKx++pPt3US2sQVEC24bWPxRN7RsB
    70  BpRjoiEamkA04ioGFhMBbas5MdCLt/fd92aRQCBISOb6PU08fQiARK8g/wdpBUTx
    71  y9/Ud1vUnNaZtWm+eLrwdTXgHM3/LG1M4lc0ZqHIL3rMxhae5W+j3SL3ApreiUYu
    72  gv/0bCSypvJZjEXKS7SBR/+rtw0/mQpS8DpIkwIDAQABAoIBAQCWkraxfCpp0nn1
    73  bLGJp2Ynf4Z1Frvi4XLM+FVMvVmt6dzPu2/CYsHBX6/6Ms5YL51mzZA47+I5TmJb
    74  iOKHjiCkqk9+gIUM0vuF7giezljdYEbbWmtVoQXQ84YqgKy6THgAOILuY3OOX+kS
    75  ZG1vhlkpjFyHtRXoiKDti40bO1E2a2+O/vpD417hZrezzb97JQ4Cw417jRs3+dpc
    76  BaVutFUiIm5HFeVdD0/hqwnYMPeoxxxdj4kiuzI2FZOexPufq9MSrSI0RMnegRGL
    77  8fgg4ZhVuEONtA8eXFI8EpIEhaKOq9CPZuImyKh+Vx4pwcT7NVld70ohqhQaEVqs
    78  6QblHf6hAoGBAOqimWdjGY6PKT6ipF9/6CsNnAAyyG1IRWSLweVDK36DkIxzTKGU
    79  fk2uXFw6GlAKu1J0lTfQjxtKoYVljUHjUvfvW9KE/GyuW6eWTxUIrvmpvpcyAV6H
    80  gHkt8/A+l8sQS3oMiLJ14c8/W5d4YdB/VBLQHsOi8I5EOGsO7a52fETLAoGBANyZ
    81  3+nq/tyk6hGk+lNJSXnkURydbkONCFhU92iwPC+f/4ILcHdBVjwLOAYa/qUzHvEE
    82  H+MtMiuGbDrnjjCytvjmIKmMnJ30BHbXwn0dV+hes1O0EwHoIGtvQyWVH/6zB4ar
    83  YkhK9IBtOxfs3ORVeVBoHx/Mq40BAGzGxQQopVpZAoGAScFtCWPMb9SuuWK02tRB
    84  Le9sP1+3Qyr5rT6FZ8TykiVXNd80koI0JcUOgWs+RDTrZ2MAWPg1U/XkyiL/AVwt
    85  A4T5TzbAhoVUiFymZU1Ce3aRU8PDTGy5xN3eFYIHgyyPHUF9YuPNZLFc4ENWNA0i
    86  Z3uGgCbjCUWGmpipvDLAo3sCgYApQEDlvgLAgbofaIlCz76Eo5QjVLEMwq+fzOui
    87  0OnAQhwGVltGgZo9ih+EzMF3ZNLRYOMRmR77kpxke25UXubmLipHajrTMpEvI/OD
    88  b9xDYIoKCe9P+Pcu/9Q/j942w4WRwjSTriiAZ2yYcbtwmycfSQkg6iXeLSTGMnke
    89  6PbaqQKBgQDGNwOgdHtMdHyy2kDMLdGKCysEo2eBNAxdRqjGxmsjm6bsd4xyLxS2
    90  lkf7v3e9vE24HfBbwMoW4sx1eEDbFc4pai4l4vG3dpbrd3CJa5mpvL3mxGnTlPUy
    91  1PopL5pyjSZ6bcRETolZNM4L8X4jgfwHl3Lvc5jBgQW0PCAVtBVp8g==
    92  -----END RSA PRIVATE KEY-----
    93  		`)
    94  
    95  		Convey("then parsePublicKeysFromPEM should return with an error", func() {
    96  			keys, err := parsePublicKeysFromPEM(pemBytes)
    97  			So(keys, ShouldBeNil)
    98  			So(err, ShouldNotBeNil)
    99  			So(err.Error(), ShouldEqual, "no valid certificates or public keys found (errors: [unsupported PEM type RSA PRIVATE KEY])")
   100  		})
   101  	})
   102  
   103  	Convey("Given a PEM with a valid ECDSA and RSA public key, and a DSA public key and an invalid PKCS#1 RSA public key", t, func() {
   104  		pemBytes := []byte(`
   105  -----BEGIN PUBLIC KEY-----
   106  MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnlK01BDTYbvRBxGM0o3vXNqqvI25
   107  eZ/s3Cq9OXnNpoCI3/DH/tuD3n7cnWcNSfl1qJIH2LVZ0cWUW/L/9i/jPA==
   108  -----END PUBLIC KEY-----
   109  -----BEGIN PUBLIC KEY-----
   110  MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyjDEPJD1Fv1IJIq4mnec
   111  oMlSve0vZOTuzDmKuMB4vfBXalKZgbp4ONL+BvWV9OPs22Smv9SAfnoQ25q8Q9so
   112  ihzUKhaIAY2CI70ll4exbLK9FD4uTi1bqn0FdIh04UIyW6s2EqTGMkSKx9THNvAM
   113  Kx++pPt3US2sQVEC24bWPxRN7RsBBpRjoiEamkA04ioGFhMBbas5MdCLt/fd92aR
   114  QCBISOb6PU08fQiARK8g/wdpBUTxy9/Ud1vUnNaZtWm+eLrwdTXgHM3/LG1M4lc0
   115  ZqHIL3rMxhae5W+j3SL3ApreiUYugv/0bCSypvJZjEXKS7SBR/+rtw0/mQpS8DpI
   116  kwIDAQAB
   117  -----END PUBLIC KEY-----
   118  -----BEGIN PUBLIC KEY-----
   119  MIIDSDCCAjoGByqGSM44BAEwggItAoIBAQCsVBV4gVV/zdmxWu8cU95vxY5D2RVG
   120  n6r56BOmnBF6beLZJKIK17FsurubePRfhLiVSk/RIA3aECPe8kRdRYAR23daCptw
   121  THaZMZ0s2mNQfJEc6sXCE3/EVlPPEZqvm7RilYxb1PNZY55X7EzMhhBc1zRiSQck
   122  Va8qDHP98vvZjd4G9W+aF2UOMQko9iN6hTjFkUgmNhqIHS3UAoANQ3y2sYHXZZuq
   123  EP9EKk8EQ5wv4w73eFJXj84pN6L3VvhLjq1Akjk/gl2p7w8cCdXzcfKBD7qXQZZr
   124  Qt4Pmz/BQu6wr4QBX3FiIghUZULlnCjhFNIrXTYbOskK/XGg62aV7Qn5AiEA6hP4
   125  cBgclv0kO5Qyg3qLVwMWOO1e4opX6EbqmK+kXysCggEBAIF77NYg4ttsGG2OiIs2
   126  yVBsV4w7EORIC+lG2+ZzVRSHm3QtNPeLoN6PwDtagpER2pUyjpXuxOcgE47hSUCQ
   127  RpSjXGtj22WbKjXZ2p8mkTScFvA2btgR+O4Nx0f0eShCz1fkrt8BaKRumzrzgoNI
   128  mcAuVOVqLLl4VkOXwsGvuH5cBVhW1sNKDc3VMYTsh34MDSJJEutFZeCokYwd6wo2
   129  pYVdXsDmc7uhPRK3YhtBV3lrXIehNlIukyO7li+wKU7SLyneBY/huBzYrw1JBDWK
   130  1CHqRDJm38yzpEOKhu3gefR+j1BZqev9O2tsbFJe3F/cYV1hDWR8jsZz+gfDUXja
   131  z9oDggEGAAKCAQEAoIbxish+OZADAwMJRP8nGYVIfSkWBXvC96nfQG4tZtqB4Z14
   132  cjOyChnMuHlQnDIWYhVVmDiIHJFGtsHUb8iPGqbpGeEmScWG4HsSnsNAK/dOKVTE
   133  OxGaq/3+Lisg8uyTqzAR5W5OdFlCw3qhzYG6G7kHNxGicN5qLQILTQeHIJiuioiE
   134  oDhpga7IB8pGNsXHpO40KeFe2BaZBpKnCQUF32kMnEFP9AqYnZ/io2vhCViee+O3
   135  A5/Wjke753qo+HUPj7C41wUwvXbXNfkGpXE4nyJZb37Ed+IMQu3sE/X6A2Vgbl+F
   136  2mpfWPo/ZC23fGe4ExyTKsD+hRIP2LlxhWI1xw==
   137  -----END PUBLIC KEY-----
   138  -----BEGIN RSA PUBLIC KEY-----
   139  MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyjDEPJD1Fv1IJIq4mnec
   140  oMlSve0vZOTuzDmKuMB4vfBXalKZgbp4ONL+BvWV9OPs22Smv9SAfnoQ25q8Q9so
   141  ihzUKhaIAY2CI70ll4exbLK9FD4uTi1bqn0FdIh04UIyW6s2EqTGMkSKx9THNvAM
   142  Kx++pPt3US2sQVEC24bWPxRN7RsBBpRjoiEamkA04ioGFhMBbas5MdCLt/fd92aR
   143  QCBISOb6PU08fQiARK8g/wdpBUTxy9/Ud1vUnNaZtWm+eLrwdTXgHM3/LG1M4lc0
   144  ZqHIL3rMxhae5W+j3SL3ApreiUYugv/0bCSypvJZjEXKS7SBR/+rtw0/mQpS8DpI
   145  kwIDAQAB
   146  -----END RSA PUBLIC KEY-----
   147  		`)
   148  
   149  		Convey("then parsePublicKeysFromPEM should return with an error", func() {
   150  			keys, err := parsePublicKeysFromPEM(pemBytes)
   151  			So(keys, ShouldNotBeNil)
   152  			So(err, ShouldNotBeNil)
   153  			So(len(keys), ShouldEqual, 2)
   154  			So(err.Error(), ShouldEqual, "[unsupported key type *dsa.PublicKey; x509: failed to parse public key (use ParsePKIXPublicKey instead for this key format)]")
   155  			So(keys[0], ShouldHaveSameTypeAs, &ecdsa.PublicKey{})
   156  			So(keys[1], ShouldHaveSameTypeAs, &rsa.PublicKey{})
   157  		})
   158  	})
   159  }