key_test.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. /*
  15. Copyright 2018 The Kubernetes Authors.
  16. Licensed under the Apache License, Version 2.0 (the "License");
  17. you may not use this file except in compliance with the License.
  18. You may obtain a copy of the License at
  19. http://www.apache.org/licenses/LICENSE-2.0
  20. Unless required by applicable law or agreed to in writing, software
  21. distributed under the License is distributed on an "AS IS" BASIS,
  22. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  23. See the License for the specific language governing permissions and
  24. limitations under the License.
  25. */
  26. package key
  27. import (
  28. "io/ioutil"
  29. "os"
  30. "testing"
  31. )
  32. const (
  33. // rsaPrivateKey is a RSA Private Key in PKCS#1 format
  34. // openssl genrsa -out rsa2048.pem 2048
  35. rsaPrivateKey = `-----BEGIN RSA PRIVATE KEY-----
  36. MIIEpAIBAAKCAQEA92mVjhBKOFsdxFzb/Pjq+7b5TJlODAdY5hK+WxLZTIrfhDPq
  37. FWrGKdjSNiHbXrdEtwJh9V+RqPZVSN3aWy1224RgkyNdMJsXhJKuCC24ZKY8SXtW
  38. xuTYmMRaMnCsv6QBGRTIbZ2EFbAObVM7lDyv1VqY3amZIWFQMlZ9CNpxDSPa5yi4
  39. 3gopbXkne0oGNmey9X0qtpk7NMZIgAL6Zz4rZ30bcfC2ag6RLOFI2E/c4n8c38R8
  40. 9MfXfLkj8/Cxo4JfI9NvRCpPOpFO8d/ZtWVUuIrBQN+Y7tkN2T60Qq/TkKXUrhDe
  41. fwlTlktZVJ/GztLYU41b2GcWsh/XO+PH831rmwIDAQABAoIBAQCC9c6GDjVbM0/E
  42. WurPMusfJjE7zII1d8YkspM0HfwLug6qKdikUYpnKC/NG4rEzfl/bbFwco/lgc6O
  43. 7W/hh2U8uQttlvCDA/Uk5YddKOZL0Hpk4vaB/SxxYK3luSKXpjY2knutGg2KdVCN
  44. qdsFkkH4iyYTXuyBcMNEgedZQldI/kEujIH/L7FE+DF5TMzT4lHhozDoG+fy564q
  45. qVGUZXJn0ubc3GaPn2QOLNNM44sfYA4UJCpKBXPu85bvNObjxVQO4WqwwxU1vRnL
  46. UUsaGaelhSVJCo0dVPRvrfPPKZ09HTwpy40EkgQo6VriFc1EBoQDjENLbAJv9OfQ
  47. aCc9wiZhAoGBAP/8oEy48Zbb0P8Vdy4djf5tfBW8yXFLWzXewJ4l3itKS1r42nbX
  48. 9q3cJsgRTQm8uRcMIpWxsc3n6zG+lREvTkoTB3ViI7+uQPiqA+BtWyNy7jzufFke
  49. ONKZfg7QxxmYRWZBRnoNGNbMpNeERuLmhvQuom9D1WbhzAYJbfs/O4WTAoGBAPds
  50. 2FNDU0gaesFDdkIUGq1nIJqRQDW485LXZm4pFqBFxdOpbdWRuYT2XZjd3fD0XY98
  51. Nhkpb7NTMCuK3BdKcqIptt+cK+quQgYid0hhhgZbpCQ5AL6c6KgyjgpYlh2enzU9
  52. Zo3yg8ej1zbbA11sBlhX+5iO2P1u5DG+JHLwUUbZAoGAUwaU102EzfEtsA4+QW7E
  53. hyjrfgFlNKHES4yb3K9bh57pIfBkqvcQwwMMcQdrfSUAw0DkVrjzel0mI1Q09QXq
  54. 1ould6UFAz55RC2gZEITtUOpkYmoOx9aPrQZ9qQwb1S77ZZuTVfCHqjxLhVxCFbM
  55. npYhiQTvShciHTMhwMOZgpECgYAVV5EtVXBYltgh1YTc3EkUzgF087R7LdHsx6Gx
  56. POATwRD4WfP8aQ58lpeqOPEM+LcdSlSMRRO6fyF3kAm+BJDwxfJdRWZQXumZB94M
  57. I0VhRQRaj4Qt7PDwmTPBVrTUJzuKZxpyggm17b8Bn1Ch/VBqzGQKW8AB1E/grosM
  58. UwhfuQKBgQC2JO/iqTQScHClf0qlItCJsBuVukFmSAVCkpOD8YdbdlPdOOwSk1wQ
  59. C0eAlsC3BCMvkpidKQmra6IqIrvTGI6EFgkrb3aknWdup2w8j2udYCNqyE3W+fVe
  60. p8FdYQ1FkACQ+daO5VlClL/9l0sGjKXlNKbpmJ2H4ngZmXj5uGmxuQ==
  61. -----END RSA PRIVATE KEY-----`
  62. // rsaPublicKey is a RSA Public Key in PEM encoded format
  63. // openssl rsa -in rsa2048.pem -pubout -out rsa2048pub.pem
  64. rsaPublicKey = `-----BEGIN PUBLIC KEY-----
  65. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA92mVjhBKOFsdxFzb/Pjq
  66. +7b5TJlODAdY5hK+WxLZTIrfhDPqFWrGKdjSNiHbXrdEtwJh9V+RqPZVSN3aWy12
  67. 24RgkyNdMJsXhJKuCC24ZKY8SXtWxuTYmMRaMnCsv6QBGRTIbZ2EFbAObVM7lDyv
  68. 1VqY3amZIWFQMlZ9CNpxDSPa5yi43gopbXkne0oGNmey9X0qtpk7NMZIgAL6Zz4r
  69. Z30bcfC2ag6RLOFI2E/c4n8c38R89MfXfLkj8/Cxo4JfI9NvRCpPOpFO8d/ZtWVU
  70. uIrBQN+Y7tkN2T60Qq/TkKXUrhDefwlTlktZVJ/GztLYU41b2GcWsh/XO+PH831r
  71. mwIDAQAB
  72. -----END PUBLIC KEY-----`
  73. // certificate is an x509 certificate in PEM encoded format
  74. // openssl req -new -key rsa2048.pem -sha256 -nodes -x509 -days 1826 -out x509certificate.pem -subj "/C=US/CN=not-valid"
  75. certificate = `-----BEGIN CERTIFICATE-----
  76. MIIDFTCCAf2gAwIBAgIJAN8B8NOwtiUCMA0GCSqGSIb3DQEBCwUAMCExCzAJBgNV
  77. BAYTAlVTMRIwEAYDVQQDDAlub3QtdmFsaWQwHhcNMTcwMzIyMDI1NjM2WhcNMjIw
  78. MzIyMDI1NjM2WjAhMQswCQYDVQQGEwJVUzESMBAGA1UEAwwJbm90LXZhbGlkMIIB
  79. IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA92mVjhBKOFsdxFzb/Pjq+7b5
  80. TJlODAdY5hK+WxLZTIrfhDPqFWrGKdjSNiHbXrdEtwJh9V+RqPZVSN3aWy1224Rg
  81. kyNdMJsXhJKuCC24ZKY8SXtWxuTYmMRaMnCsv6QBGRTIbZ2EFbAObVM7lDyv1VqY
  82. 3amZIWFQMlZ9CNpxDSPa5yi43gopbXkne0oGNmey9X0qtpk7NMZIgAL6Zz4rZ30b
  83. cfC2ag6RLOFI2E/c4n8c38R89MfXfLkj8/Cxo4JfI9NvRCpPOpFO8d/ZtWVUuIrB
  84. QN+Y7tkN2T60Qq/TkKXUrhDefwlTlktZVJ/GztLYU41b2GcWsh/XO+PH831rmwID
  85. AQABo1AwTjAdBgNVHQ4EFgQU1I5GfinLF7ta+dBJ6UWcrYaexLswHwYDVR0jBBgw
  86. FoAU1I5GfinLF7ta+dBJ6UWcrYaexLswDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B
  87. AQsFAAOCAQEAUl0wUD4y41juHFOVMYiziPYr1ShSpQXdwp8FfaHrzI5hsr8UMe8D
  88. dzb9QzZ4bx3yZhiG3ahrSBh956thMTHrKTEwAfJIEXI4cuSVWQAaOJ4Em5SDFxQe
  89. d0E6Ui2nGh1SFGF7oyuEXyzqgRMWFNDFw9HLUNgXaO18Zfouw8+K0BgbfEWEcSi1
  90. JLQbyhCjz088gltrliQGPWDFAg9cHBKtJhuTzZkvuqK1CLEmBhtzP1zFiGBfOJc8
  91. v+aKjAwrPUNX11cXOCPxBv2qXMetxaovBem6AI2hvypCInXaVQfP+yOLubzlTDjS
  92. Y708SlY38hmS1uTwDpyLOn8AKkZ8jtx75g==
  93. -----END CERTIFICATE-----`
  94. // ecdsaPrivateKeyWithParams is a ECDSA Private Key with included EC Parameters block
  95. // openssl ecparam -name prime256v1 -genkey -out ecdsa256params.pem
  96. ecdsaPrivateKeyWithParams = `-----BEGIN EC PARAMETERS-----
  97. BggqhkjOPQMBBw==
  98. -----END EC PARAMETERS-----
  99. -----BEGIN EC PRIVATE KEY-----
  100. MHcCAQEEIAwSOWQqlMTZNqNF7tgua812Jxib1DVOgb2pHHyIEyNNoAoGCCqGSM49
  101. AwEHoUQDQgAEyxYNrs6a6tsNCFNYn+l+JDUZ0PnUZbcsDgJn2O62D1se8M5iQ5rY
  102. iIv6RpxE3VHvlHEIvYgCZkG0jHszTUopBg==
  103. -----END EC PRIVATE KEY-----`
  104. // ecdsaPrivateKey is a ECDSA Private Key in ASN.1 format
  105. // openssl ecparam -name prime256v1 -genkey -noout -out ecdsa256.pem
  106. ecdsaPrivateKey = `-----BEGIN EC PRIVATE KEY-----
  107. MHcCAQEEIP6Qw6dHDiLsSnLXUhQVTPE0fTQQrj3XSbiQAZPXnk5+oAoGCCqGSM49
  108. AwEHoUQDQgAEZZzi1u5f2/AEGFI/HYUhU+u6cTK1q2bbtE7r1JMK+/sQA5sNAp+7
  109. Vdc3psr1OaNzyTyuhTECyRdFKXm63cMnGg==
  110. -----END EC PRIVATE KEY-----`
  111. // ecdsaPublicKey is a ECDSA Public Key in PEM encoded format
  112. // openssl ec -in ecdsa256.pem -pubout -out ecdsa256pub.pem
  113. ecdsaPublicKey = `-----BEGIN PUBLIC KEY-----
  114. MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZZzi1u5f2/AEGFI/HYUhU+u6cTK1
  115. q2bbtE7r1JMK+/sQA5sNAp+7Vdc3psr1OaNzyTyuhTECyRdFKXm63cMnGg==
  116. -----END PUBLIC KEY-----`
  117. )
  118. func TestReadPrivateKey(t *testing.T) {
  119. f, err := ioutil.TempFile("", "")
  120. if err != nil {
  121. t.Fatalf("error creating tmpfile: %v", err)
  122. }
  123. defer os.Remove(f.Name())
  124. if _, err := PrivateKeyFromFile(f.Name()); err == nil {
  125. t.Fatalf("Expected error reading key from empty file, got none")
  126. }
  127. if err := ioutil.WriteFile(f.Name(), []byte(rsaPrivateKey), os.FileMode(0600)); err != nil {
  128. t.Fatalf("error writing private key to tmpfile: %v", err)
  129. }
  130. if _, err := PrivateKeyFromFile(f.Name()); err != nil {
  131. t.Fatalf("error reading private RSA key: %v", err)
  132. }
  133. if err := ioutil.WriteFile(f.Name(), []byte(ecdsaPrivateKey), os.FileMode(0600)); err != nil {
  134. t.Fatalf("error writing private key to tmpfile: %v", err)
  135. }
  136. if _, err := PrivateKeyFromFile(f.Name()); err != nil {
  137. t.Fatalf("error reading private ECDSA key: %v", err)
  138. }
  139. if err := ioutil.WriteFile(f.Name(), []byte(ecdsaPrivateKeyWithParams), os.FileMode(0600)); err != nil {
  140. t.Fatalf("error writing private key to tmpfile: %v", err)
  141. }
  142. if _, err := PrivateKeyFromFile(f.Name()); err != nil {
  143. t.Fatalf("error reading private ECDSA key with params: %v", err)
  144. }
  145. }
  146. func TestReadPublicKeys(t *testing.T) {
  147. f, err := ioutil.TempFile("", "")
  148. if err != nil {
  149. t.Fatalf("error creating tmpfile: %v", err)
  150. }
  151. defer os.Remove(f.Name())
  152. if _, err := PublicKeysFromFile(f.Name()); err == nil {
  153. t.Fatalf("Expected error reading keys from empty file, got none")
  154. }
  155. if err := ioutil.WriteFile(f.Name(), []byte(rsaPublicKey), os.FileMode(0600)); err != nil {
  156. t.Fatalf("error writing public key to tmpfile: %v", err)
  157. }
  158. if keys, err := PublicKeysFromFile(f.Name()); err != nil {
  159. t.Fatalf("error reading RSA public key: %v", err)
  160. } else if len(keys) != 1 {
  161. t.Fatalf("expected 1 key, got %d", len(keys))
  162. }
  163. if err := ioutil.WriteFile(f.Name(), []byte(ecdsaPublicKey), os.FileMode(0600)); err != nil {
  164. t.Fatalf("error writing public key to tmpfile: %v", err)
  165. }
  166. if keys, err := PublicKeysFromFile(f.Name()); err != nil {
  167. t.Fatalf("error reading ECDSA public key: %v", err)
  168. } else if len(keys) != 1 {
  169. t.Fatalf("expected 1 key, got %d", len(keys))
  170. }
  171. if err := ioutil.WriteFile(f.Name(), []byte(rsaPublicKey+"\n"+ecdsaPublicKey), os.FileMode(0600)); err != nil {
  172. t.Fatalf("error writing public key to tmpfile: %v", err)
  173. }
  174. if keys, err := PublicKeysFromFile(f.Name()); err != nil {
  175. t.Fatalf("error reading combined RSA/ECDSA public key file: %v", err)
  176. } else if len(keys) != 2 {
  177. t.Fatalf("expected 2 keys, got %d", len(keys))
  178. }
  179. if err := ioutil.WriteFile(f.Name(), []byte(certificate), os.FileMode(0600)); err != nil {
  180. t.Fatalf("error writing certificate to tmpfile: %v", err)
  181. }
  182. if keys, err := PublicKeysFromFile(f.Name()); err != nil {
  183. t.Fatalf("error reading public key from certificate file: %v", err)
  184. } else if len(keys) != 1 {
  185. t.Fatalf("expected 1 keys, got %d", len(keys))
  186. }
  187. }