template_test.go 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977
  1. /*
  2. Copyright © 2025 ESO Maintainer Team
  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. https://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package template
  14. import (
  15. "crypto/rand"
  16. "crypto/rsa"
  17. "crypto/x509"
  18. "encoding/pem"
  19. "os"
  20. "strings"
  21. "testing"
  22. "github.com/google/go-cmp/cmp"
  23. "github.com/stretchr/testify/assert"
  24. "github.com/stretchr/testify/require"
  25. corev1 "k8s.io/api/core/v1"
  26. v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  27. esapi "github.com/external-secrets/external-secrets/apis/externalsecrets/v1"
  28. )
  29. const (
  30. pkcs12ContentNoPass = `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`
  31. pkcs12ContentWithPass = `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`
  32. pkcs12Cert = `-----BEGIN CERTIFICATE-----
  33. MIIDHTCCAgWgAwIBAgIRAKC4yxy9QGocND+6avTf7BgwDQYJKoZIhvcNAQELBQAw
  34. EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0yMTAzMjAyMDA4MDhaFw0yMTAzMjAyMDM4
  35. MDhaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
  36. ggEKAoIBAQC3o6/JdZEqNbqNRkopHhJtJG5c4qS5d0tQ/kZYpfD/v/izAYum4Nzj
  37. aG15owr92/11W0pxPUliRLti3y6iScTs+ofm2D7p4UXj/Fnho/2xoWSOoWAodgvW
  38. Y8jh8A0LQALZiV/9QsrJdXZdS47DYZLsQ3z9yFC/CdXkg1l7AQ3fIVGKdrQBr9kE
  39. 1gEDqnKfRxXI8DEQKXr+CKPUwCAytegmy0SHp53zNAvY+kopHytzmJpXLoEhxq4e
  40. ugHe52vXHdh/HJ9VjNp0xOH1waAgAGxHlltCW0PVd5AJ0SXROBS/a3V9sZCbCrJa
  41. YOOonQSEswveSv6PcG9AHvpNPot2Xs6hAgMBAAGjbjBsMA4GA1UdDwEB/wQEAwIC
  42. pDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
  43. BBR00805mrpoonp95RmC3B6oLl+cGTAVBgNVHREEDjAMggpnb29ibGUuY29tMA0G
  44. CSqGSIb3DQEBCwUAA4IBAQAipc1b6JrEDayPjpz5GM5krcI8dCWVd8re0a9bGjjN
  45. ioWGlu/eTr5El0ffwCNZ2WLmL9rewfHf/bMvYz3ioFZJ2OTxfazqYXNggQz6cMfa
  46. lbedDCdt5XLVX2TyerGvFram+9Uyvk3l0uM7rZnwAmdirG4Tv94QRaD3q4xTj/c0
  47. mv+AggtK0aRFb9o47z/BypLdk5mhbf3Mmr88C8XBzEnfdYyf4JpTlZrYLBmDCu5d
  48. 9RLLsjXxhag8xqMtd1uLUM8XOTGzVWacw8iGY+CTtBKqyA+AE6/bDwZvEwVtsKtC
  49. QJ85ioEpy00NioqcF0WyMZH80uMsPycfpnl5uF7RkW8u
  50. -----END CERTIFICATE-----
  51. `
  52. pkcs12Key = `-----BEGIN PRIVATE KEY-----
  53. MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC3o6/JdZEqNbqN
  54. RkopHhJtJG5c4qS5d0tQ/kZYpfD/v/izAYum4NzjaG15owr92/11W0pxPUliRLti
  55. 3y6iScTs+ofm2D7p4UXj/Fnho/2xoWSOoWAodgvWY8jh8A0LQALZiV/9QsrJdXZd
  56. S47DYZLsQ3z9yFC/CdXkg1l7AQ3fIVGKdrQBr9kE1gEDqnKfRxXI8DEQKXr+CKPU
  57. wCAytegmy0SHp53zNAvY+kopHytzmJpXLoEhxq4eugHe52vXHdh/HJ9VjNp0xOH1
  58. waAgAGxHlltCW0PVd5AJ0SXROBS/a3V9sZCbCrJaYOOonQSEswveSv6PcG9AHvpN
  59. Pot2Xs6hAgMBAAECggEACTGPrmVNZDCWa1Y2hkJ0J7SoNcw+9O4M/jwMp4l/PD6P
  60. I98S78LYLCZhPLK17SmjUcnFO1AXKW1JeFS2D/fjfP256guvcqQNjLFoioxcOhVb
  61. ZGyd1Mi8JPqP5wfOj16gBeYDwTkjz9wqldcfiZaL9XoXetkZecbzR2JwC2FtIVuC
  62. 0njTjMNYpaBKnoLb8OTR0EQz7lYEo2MkQiWryz8wseONnFmdfh18p+p10YgCbuCH
  63. qesrWfDLLxaxZelNtDhDngg9LoCLmarYy7BgShacmUEgJTZ/x3xFC75thK3ln0OY
  64. +ktTgvVotYYaZi7qAjQiEsTvkTAPg5RMpQLd2UIWsQKBgQDCBp+1vURbwGzmTNUg
  65. HMipD6WDFdLc9DCacx6+ZqsEPTMWQbCpVZrDKiY0Rjt5F+xOCyMr00J5RDJXRC0G
  66. +L7NcJdywOFutT7vB+cmETg7l/6PHweNYBnE66706eTL/KVYZMi4tEinarPWhHmL
  67. jasfdLANtpDjdWkRt299TkPRbQKBgQDyS8Rr7KZdv04Csqkf+ASmiJpT5R6Y72kc
  68. 3XYpKETyB2FyPZkuh/zInMut9SkkSI9O/jA3zf956jj6sF1DHvp7T8KkIp5OAQeD
  69. J9AF65m2MnZfHFUeJ6ZQsggwMWqrD0ycIWP7YWtiBHH+D1wGkjYrssq+bvG/yNpA
  70. LtqdKq9lhQKBgQCZA2hIhy61vRckuEsLvCdzTGeW7UsR/XGnHEqOlaEhArKbRsrv
  71. gBdA+qiOaSTV5svw8E+YbE7sG6AnuhhYeyreEYEeeoZOLJmpIG5mUwYp2UBj1nC6
  72. SaOI7OVZOGu7g09SWokBQQxbG4cgEfFY4Sym7fs5lVTGTP3Dfwppo6NQMQKBgQCo
  73. J5NDP3Lafwk58BpV+H/pv8YzUUDh7M2rXbtCpxLqUdr8OOnVlEUISWFF8m5CIyVq
  74. MhjuscWLK9Wtjba7/YTjDaDM3sW05xv6lyfU5ATCoNTr/zLHgcb4HAZ4w+L+otiN
  75. RtMnxB2NYf5mzuwUF2cG/secUEzwyAlIH/xStSwTLQKBgQCRvqF+rqxnegoOgwVW
  76. qrWPv06wXD8dW2FlPpY5GXqA0l6erSK3YsQQToRmbem9ibPD7bd5P4gNbWfxwK4C
  77. Wt+1Rcb8OrDhDJbYz85bXBnPecKp4EN0b9SHO0/dsCqn2w30emc+9T/4m1ZDkpBd
  78. BixHvI/EJ8YK3ta5WdJWKC6hnA==
  79. -----END PRIVATE KEY-----
  80. `
  81. jwkPubRSA = `{"kid":"ex","kty":"RSA","key_ops":["sign","verify","wrapKey","unwrapKey","encrypt","decrypt"],"n":"p2VQo8qCfWAZmdWBVaYuYb-a-tWWm78K6Sr9poCvNcmv8rUPSLACxitQWR8gZaSH1DklVkqz-Ed8Cdlf8lkDg4Ex5tkB64jRdC1Uvn4CDpOH6cp-N2s8hTFLqy9_YaDmyQS7HiqthOi9oVjil1VMeWfaAbClGtFt6UnKD0Vb_DvLoWYQSqlhgBArFJi966b4E1pOq5Ad02K8pHBDThlIIx7unibLehhDU6q3DCwNH_OOLx6bgNtmvGYJDd1cywpkLQ3YzNCUPWnfMBJRP3iQP_WI21uP6cvo0DqBPBM4wvVzHbCT0vnIflwkbgEWkq1FprqAitZlop9KjLqzjp9vyQ","e":"AQAB"}`
  82. jwkPubRSAPKIX = `-----BEGIN PUBLIC KEY-----
  83. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp2VQo8qCfWAZmdWBVaYu
  84. Yb+a+tWWm78K6Sr9poCvNcmv8rUPSLACxitQWR8gZaSH1DklVkqz+Ed8Cdlf8lkD
  85. g4Ex5tkB64jRdC1Uvn4CDpOH6cp+N2s8hTFLqy9/YaDmyQS7HiqthOi9oVjil1VM
  86. eWfaAbClGtFt6UnKD0Vb/DvLoWYQSqlhgBArFJi966b4E1pOq5Ad02K8pHBDThlI
  87. Ix7unibLehhDU6q3DCwNH/OOLx6bgNtmvGYJDd1cywpkLQ3YzNCUPWnfMBJRP3iQ
  88. P/WI21uP6cvo0DqBPBM4wvVzHbCT0vnIflwkbgEWkq1FprqAitZlop9KjLqzjp9v
  89. yQIDAQAB
  90. -----END PUBLIC KEY-----
  91. `
  92. jwkPrivRSA = `{"kty" : "RSA","kid" : "cc34c0a0-bd5a-4a3c-a50d-a2a7db7643df","use" : "sig","n" : "pjdss8ZaDfEH6K6U7GeW2nxDqR4IP049fk1fK0lndimbMMVBdPv_hSpm8T8EtBDxrUdi1OHZfMhUixGaut-3nQ4GG9nM249oxhCtxqqNvEXrmQRGqczyLxuh-fKn9Fg--hS9UpazHpfVAFnB5aCfXoNhPuI8oByyFKMKaOVgHNqP5NBEqabiLftZD3W_lsFCPGuzr4Vp0YS7zS2hDYScC2oOMu4rGU1LcMZf39p3153Cq7bS2Xh6Y-vw5pwzFYZdjQxDn8x8BG3fJ6j8TGLXQsbKH1218_HcUJRvMwdpbUQG5nvA2GXVqLqdwp054Lzk9_B_f1lVrmOKuHjTNHq48w","e" : "AQAB","d" : "ksDmucdMJXkFGZxiomNHnroOZxe8AmDLDGO1vhs-POa5PZM7mtUPonxwjVmthmpbZzla-kg55OFfO7YcXhg-Hm2OWTKwm73_rLh3JavaHjvBqsVKuorX3V3RYkSro6HyYIzFJ1Ek7sLxbjDRcDOj4ievSX0oN9l-JZhaDYlPlci5uJsoqro_YrE0PRRWVhtGynd-_aWgQv1YzkfZuMD-hJtDi1Im2humOWxA4eZrFs9eG-whXcOvaSwO4sSGbS99ecQZHM2TcdXeAs1PvjVgQ_dKnZlGN3lTWoWfQP55Z7Tgt8Nf1q4ZAKd-NlMe-7iqCFfsnFwXjSiaOa2CRGZn-Q","p" : "4A5nU4ahEww7B65yuzmGeCUUi8ikWzv1C81pSyUKvKzu8CX41hp9J6oRaLGesKImYiuVQK47FhZ--wwfpRwHvSxtNU9qXb8ewo-BvadyO1eVrIk4tNV543QlSe7pQAoJGkxCia5rfznAE3InKF4JvIlchyqs0RQ8wx7lULqwnn0","q" : "ven83GM6SfrmO-TBHbjTk6JhP_3CMsIvmSdo4KrbQNvp4vHO3w1_0zJ3URkmkYGhz2tgPlfd7v1l2I6QkIh4Bumdj6FyFZEBpxjE4MpfdNVcNINvVj87cLyTRmIcaGxmfylY7QErP8GFA-k4UoH_eQmGKGK44TRzYj5hZYGWIC8","dp" : "lmmU_AG5SGxBhJqb8wxfNXDPJjf__i92BgJT2Vp4pskBbr5PGoyV0HbfUQVMnw977RONEurkR6O6gxZUeCclGt4kQlGZ-m0_XSWx13v9t9DIbheAtgVJ2mQyVDvK4m7aRYlEceFh0PsX8vYDS5o1txgPwb3oXkPTtrmbAGMUBpE","dq" : "mxRTU3QDyR2EnCv0Nl0TCF90oliJGAHR9HJmBe__EjuCBbwHfcT8OG3hWOv8vpzokQPRl5cQt3NckzX3fs6xlJN4Ai2Hh2zduKFVQ2p-AF2p6Yfahscjtq-GY9cB85NxLy2IXCC0PF--Sq9LOrTE9QV988SJy_yUrAjcZ5MmECk","qi" : "ldHXIrEmMZVaNwGzDF9WG8sHj2mOZmQpw9yrjLK9hAsmsNr5LTyqWAqJIYZSwPTYWhY4nu2O0EY9G9uYiqewXfCKw_UngrJt8Xwfq1Zruz0YY869zPN4GiE9-9rzdZB33RBw8kIOquY3MK74FMwCihYx_LiU2YTHkaoJ3ncvtvg"}`
  93. jwkPrivRSAPKCS8 = `-----BEGIN PRIVATE KEY-----
  94. MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQCmN2yzxloN8Qfo
  95. rpTsZ5bafEOpHgg/Tj1+TV8rSWd2KZswxUF0+/+FKmbxPwS0EPGtR2LU4dl8yFSL
  96. EZq637edDgYb2czbj2jGEK3Gqo28ReuZBEapzPIvG6H58qf0WD76FL1SlrMel9UA
  97. WcHloJ9eg2E+4jygHLIUowpo5WAc2o/k0ESppuIt+1kPdb+WwUI8a7OvhWnRhLvN
  98. LaENhJwLag4y7isZTUtwxl/f2nfXncKrttLZeHpj6/DmnDMVhl2NDEOfzHwEbd8n
  99. qPxMYtdCxsofXbXz8dxQlG8zB2ltRAbme8DYZdWoup3CnTngvOT38H9/WVWuY4q4
  100. eNM0erjzAgMBAAECggEBAJLA5rnHTCV5BRmcYqJjR566DmcXvAJgywxjtb4bPjzm
  101. uT2TO5rVD6J8cI1ZrYZqW2c5WvpIOeThXzu2HF4YPh5tjlkysJu9/6y4dyWr2h47
  102. warFSrqK191d0WJEq6Oh8mCMxSdRJO7C8W4w0XAzo+Inr0l9KDfZfiWYWg2JT5XI
  103. ubibKKq6P2KxND0UVlYbRsp3fv2loEL9WM5H2bjA/oSbQ4tSJtobpjlsQOHmaxbP
  104. XhvsIV3Dr2ksDuLEhm0vfXnEGRzNk3HV3gLNT741YEP3Sp2ZRjd5U1qFn0D+eWe0
  105. 4LfDX9auGQCnfjZTHvu4qghX7JxcF40omjmtgkRmZ/kCgYEA4A5nU4ahEww7B65y
  106. uzmGeCUUi8ikWzv1C81pSyUKvKzu8CX41hp9J6oRaLGesKImYiuVQK47FhZ++wwf
  107. pRwHvSxtNU9qXb8ewo+BvadyO1eVrIk4tNV543QlSe7pQAoJGkxCia5rfznAE3In
  108. KF4JvIlchyqs0RQ8wx7lULqwnn0CgYEAven83GM6SfrmO+TBHbjTk6JhP/3CMsIv
  109. mSdo4KrbQNvp4vHO3w1/0zJ3URkmkYGhz2tgPlfd7v1l2I6QkIh4Bumdj6FyFZEB
  110. pxjE4MpfdNVcNINvVj87cLyTRmIcaGxmfylY7QErP8GFA+k4UoH/eQmGKGK44TRz
  111. Yj5hZYGWIC8CgYEAlmmU/AG5SGxBhJqb8wxfNXDPJjf//i92BgJT2Vp4pskBbr5P
  112. GoyV0HbfUQVMnw977RONEurkR6O6gxZUeCclGt4kQlGZ+m0/XSWx13v9t9DIbheA
  113. tgVJ2mQyVDvK4m7aRYlEceFh0PsX8vYDS5o1txgPwb3oXkPTtrmbAGMUBpECgYEA
  114. mxRTU3QDyR2EnCv0Nl0TCF90oliJGAHR9HJmBe//EjuCBbwHfcT8OG3hWOv8vpzo
  115. kQPRl5cQt3NckzX3fs6xlJN4Ai2Hh2zduKFVQ2p+AF2p6Yfahscjtq+GY9cB85Nx
  116. Ly2IXCC0PF++Sq9LOrTE9QV988SJy/yUrAjcZ5MmECkCgYEAldHXIrEmMZVaNwGz
  117. DF9WG8sHj2mOZmQpw9yrjLK9hAsmsNr5LTyqWAqJIYZSwPTYWhY4nu2O0EY9G9uY
  118. iqewXfCKw/UngrJt8Xwfq1Zruz0YY869zPN4GiE9+9rzdZB33RBw8kIOquY3MK74
  119. FMwCihYx/LiU2YTHkaoJ3ncvtvg=
  120. -----END PRIVATE KEY-----
  121. `
  122. jwkPubEC = `{"kid":"https://kv-test-mj.vault.azure.net/keys/ec-p-521/e3d0e9c179b54988860c69c6ae172c65","kty":"EC","key_ops":["sign","verify"],"crv":"P-521","x":"AedOAtb7H7Oz1C_cPKI_R4CN_eai5nteY6KFW07FOoaqgQfVCSkQDK22fCOiMT_28c8LZYJRsiIFz_IIbQUW7bXj","y":"AOnchHnmBphIWXvanmMAmcCDkaED6ycW8GsAl9fQ43BMVZTqcTkJYn6vGnhn7MObizmkNSmgZYTwG-vZkIg03HHs"}`
  123. jwkPubECPKIX = `-----BEGIN PUBLIC KEY-----
  124. MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB504C1vsfs7PUL9w8oj9HgI395qLm
  125. e15jooVbTsU6hqqBB9UJKRAMrbZ8I6IxP/bxzwtlglGyIgXP8ghtBRbtteMA6dyE
  126. eeYGmEhZe9qeYwCZwIORoQPrJxbwawCX19DjcExVlOpxOQlifq8aeGfsw5uLOaQ1
  127. KaBlhPAb69mQiDTccew=
  128. -----END PUBLIC KEY-----
  129. `
  130. jwkPrivEC = `{"kty": "EC","kid": "rie3pHe8u8gjSa0IaJfqk7_iEfHeYfDYx-Bqi7vQc0s","crv": "P-256","x": "fDjg3Nq4jPf8IOZ0277aPVal_8iXySnzLUJAZghUzZM","y": "d863PeyBOK_Q4duiSmWwgIRzi1RPlFZTR-vACMlPg-Q","d": "jJs5xsoHUetdMabtt8H2KyX5T92nGul1chFeMT5hlr0"}`
  131. jwkPrivECPKCS8 = `-----BEGIN PRIVATE KEY-----
  132. MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgjJs5xsoHUetdMabt
  133. t8H2KyX5T92nGul1chFeMT5hlr2hRANCAAR8OODc2riM9/wg5nTbvto9VqX/yJfJ
  134. KfMtQkBmCFTNk3fOtz3sgTiv0OHbokplsICEc4tUT5RWU0frwAjJT4Pk
  135. -----END PRIVATE KEY-----
  136. `
  137. rsaDecryptPKRSAPKCS8 = `-----BEGIN PRIVATE KEY-----
  138. MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQChzs1R+jA3Goqi
  139. ropPzF4Ehpbi6VklbeZWP+RoU3rJshONJO6w9tPhbp0YIXrPSM9P5a9xaaNxDR9e
  140. u84O05+vq3C4P9I0jb5GSjiuznrmsprFWGaGdd4Vr7Fir1oqfeVc+znQFUCvkq7B
  141. EWobOonl6ktQ2OHBK0bEzXB7qY7P4ETI6owDUL+pkAwHzdnwk4sXMDKBLT3WZVRn
  142. xPppIJ4VAEph1fJOCIIskxVBh8cAT4QRxsdu8oB7cAuYJLBBKiS/GGIA7vh9sQrb
  143. +0BAgLqvy+kiQeQhYgF/Y/uVwkgAphFzSjSjoSFQ50nNE2VJA5J6o7QZ413DlIWr
  144. VJKNZJDbAgMBAAECggEAemklU5te1pExyJka8fu+NNZNWCUI2BQoaZ+0gGiHQAeE
  145. WwdRvHc/HBC+r/7EFgUTMXKmI7qzd1diIB0caoMXD6M3h2xg7nk9NZf5AeYbfGQq
  146. SpnyFk8dUHK2U94s7HCKEKnOtukdIrZplo5CI49Ju7JggC1TvPuscj6pliRUclYY
  147. Pc6pTVaG+bludDR8YkQ1mGi04wMQHpnisegRpMSjt9uZc1jKM7SSaHggu4/vuewo
  148. CFdra50/MjidIOXd5T5iVYY28J+gR8oCCKySTogNJ3JpNMNAW4FHfime5B+uS0IA
  149. YI/N8yjT/BPgRt4lQpR+6zi3fpguWNIM71xye1/R4QKBgQDNZNGFOntbFM2NTPYu
  150. 4APRVu4a0gM+JEA/ozuxTigkgaj6dNeJvaNTxcKG0MmGxQLEcvgCDaWIoM6Qrj1K
  151. YVwdiv1MddRDdSHQjGjNM6n7jNfYVQ2gP+1wDwTMN+eyAW8KoZByaQimmjyBj/Ps
  152. C8VWPxyrw/UeHqzTazyEIZ2fHQKBgQDJrM2/xx7F63C6GaW+5gMeColxkdYb29Aw
  153. R3xb2rn5lVPLW0BORQQuepZuaI+ZLTb4Op7V4yAC/S9femFXpgkZa56aacwy1jxb
  154. R9WO0CWP3QCUCcIBF/4lbJDZ6gQLr51oahXhhjbgGMrlguC/j4R9n3i58EaeukeE
  155. +Hsu/hMWVwKBgETsWALFJS/jQzbvZI1GTwGoki4d20i3EXhJZnaRK5dUi0fAfbOT
  156. F4O9ERH8biPzaIJTsjW+LpYyoB6c2aRkF20yft1xjNE2NSquc1yowZnQIX5OzEvC
  157. KAM6hvmgqPdq08BVhwtdg7GkgDlZ/Rhwur++XfilwVNiJ8yqZ5xPS31hAoGBALnu
  158. hB5MMPXd86bPoHyYSMV4h3DaOGCkzpLERUXWKOGOp5tzfJzsikdjo68U3VcmVWiT
  159. ev7MkCXRUMyg4n/RRtBV5PqNkcJIu4qYdq5c/lRdN3xEZsVlXl0Yc49EbghsFx49
  160. uACdIZiHov/oItbZNRgwXzhl6mXKbceM4tzXR7evAoGBALug2beVoVAl2nAB2RkQ
  161. Jy3viDKO+C6Z82gsS5x9Wif9cJTppIarZC+t7w33f4WHJiYT1VDxse08dohC5Nn7
  162. 7WWKdtLMSyUaXE46s37Kl5tkTkROj3wBzSIzwLYAwsthcpQVubwDAMsig8EUAdr/
  163. 0IwaauEPX9lBYMZDMYuSAR5n
  164. -----END PRIVATE KEY-----
  165. `
  166. rsaDecryptDataPKCS8Base64 = `hAZJktRFdzSkGxxiiSE46T271veCgwvC0GrY+AwDYA/KeuFZFdPgZsJ74awu1WR6x4BrbMLTXNpQw4UqChdbaM7VoKUCkPTcCU1jsveqYNisM2MNF98QjNjvp+9jXHfAsClLA5AvJxe3GjfWIi18E4PieFpATn/BTrmoklx4rSkWmfifZol7Wcny0D2fhrj/JOdxEIqowUB/tNwYzNd+lXgm55wea+G3YnD3Fr4ARaCCaQMUcdW9Kgx7mmZGZE3xDAhs8WMfpe9xVZ17Ca7Sw2r1JKS0o0fYiZNHUmCXVsP9O+//+0sfEtETiVUF0jItrwlK4GL8+bVcXQ9N2TW7+g==`
  167. rsaDecryptPKRSAPKCS1 = `-----BEGIN RSA PRIVATE KEY-----
  168. MIICXAIBAAKBgQC8ronsBTX6GD5YhoE/v76+ZkWX0gODzAD+aCYIyTs4PiWruxlV
  169. SOtjwq2gRgUexE5Hsz8cxhFz5Db8qFXBsA+GgXjByQuVbBw04SCKHgc0zhbcWonV
  170. 3Rk03pjVB1HfuxcDRja8JZontfMAJyPNJovPu3rIi8npSC+T5g7Fq9UCbQIDAQAB
  171. AoGAAo2+MiKT63GejmYro6g9taf+syJVh9gf/1F7ikzm70jwC5X5rszQ2sXMwcmQ
  172. 0izH/nJvnT0VCWOCVwMUPg3a9+odoMNFyg2u3XCLBNr3vlgG3xeCTdjzaMnY61ct
  173. xU4JgpIuiAlwCqhNfKuHxeesM/cvh9eC11ELXh27gLsNCEECQQDng5klIGPLHfiN
  174. 3wam6wxLnqHPuhXAyrOAKA1qBlZGKI6n6iBYpfN+Y70gt10f3SBlFfkSyF7uZsUy
  175. maofmjARAkEA0KM6Rj+p2CRMFMh4NpON4RKaQIYNGMTpe/akYBOx6wcZy0saON9l
  176. eHS3nq77TDT+mA3uDbu+6VD8j8eEcXUInQJAYJkfQEd4fBrAR+nj66etVKwW1gbN
  177. 5shtBy8vEasdOl7XzyY4YuSzaWwSUOFRYOcyChuV9olWWuDUrR1Cx7bdEQJBALzY
  178. gg7D4UA62oKVUfpUZL+szuJIc+JPmecSwIYWTZymuLpCKGICEx6Mxwdi6yN3dFq9
  179. gRP9NDiLjY+20DLB9CECQB5IqCvT396rjJn3g6sRXHX5qApJwInofLByafcjGd34
  180. ejJKh20FmJegJhkImmNTokNbQZbYiLAP07Ykx9A8jLg=
  181. -----END RSA PRIVATE KEY-----
  182. `
  183. rsaDecryptDataPKCS1Base64 = `Xd9Jij8+hTqM7ii1nnKbKZy7pHhn3BJwxrENwIlvf0iRysVKn7gmAaD6UV4EpNwYOHvLbo6yLWBme6msVAhIV9KOp22jDe9j837C48rcUiF93Jb7+plabbwTQt4iqi1EKxEfVvKi4tLsLBRhu0v583oQAfCf5aLwF3Vb5bPgGeY=`
  184. rsaDecryptPubKeyRSAPKCS1 = `-----BEGIN PUBLIC KEY-----
  185. MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8ronsBTX6GD5YhoE/v76+ZkWX
  186. 0gODzAD+aCYIyTs4PiWruxlVSOtjwq2gRgUexE5Hsz8cxhFz5Db8qFXBsA+GgXjB
  187. yQuVbBw04SCKHgc0zhbcWonV3Rk03pjVB1HfuxcDRja8JZontfMAJyPNJovPu3rI
  188. i8npSC+T5g7Fq9UCbQIDAQAB
  189. -----END PUBLIC KEY-----
  190. `
  191. )
  192. func rsaEncryptOAEP(t testing.TB, publicKeyPEM []byte, hash, plaintext string) []byte {
  193. t.Helper()
  194. block, _ := pem.Decode(publicKeyPEM)
  195. if block == nil || block.Type != "PUBLIC KEY" {
  196. t.Fatalf("failed to decode PEM block containing public key")
  197. }
  198. pub, err := x509.ParsePKIXPublicKey(block.Bytes)
  199. if err != nil {
  200. t.Fatalf("failed to parse DER encoded public key: %v", err)
  201. }
  202. rsaPub, ok := pub.(*rsa.PublicKey)
  203. if !ok {
  204. t.Fatalf("not RSA public key")
  205. }
  206. ciphertext, err := rsa.EncryptOAEP(getHash(hash), rand.Reader, rsaPub, []byte(plaintext), nil)
  207. require.NoError(t, err)
  208. return ciphertext
  209. }
  210. func TestExecute(t *testing.T) {
  211. tbl := []struct {
  212. name string
  213. tpl map[string][]byte
  214. labelsTpl map[string][]byte
  215. annotationsTpl map[string][]byte
  216. stringDataTpl map[string][]byte
  217. data map[string][]byte
  218. expectedData map[string][]byte
  219. expectedStringData map[string]string
  220. expectedLabels map[string]string
  221. expectedAnnotations map[string]string
  222. leftDelimiter string
  223. rightDelimiter string
  224. expErr string
  225. expLblErr string
  226. expAnnoErr string
  227. expStrErr string
  228. }{
  229. {
  230. name: "test empty",
  231. tpl: nil,
  232. labelsTpl: nil,
  233. annotationsTpl: nil,
  234. data: nil,
  235. },
  236. {
  237. name: "b64dec func",
  238. tpl: map[string][]byte{
  239. "foo": []byte("{{ .secret | b64dec }}"),
  240. },
  241. data: map[string][]byte{
  242. "secret": []byte("MTIzNA=="),
  243. },
  244. expectedData: map[string][]byte{
  245. "foo": []byte("1234"),
  246. },
  247. },
  248. {
  249. name: "fromJson func",
  250. tpl: map[string][]byte{
  251. "foo": []byte("{{ $var := .secret | fromJson }}{{ $var.foo }}"),
  252. },
  253. data: map[string][]byte{
  254. "secret": []byte(`{"foo": "bar"}`),
  255. },
  256. expectedData: map[string][]byte{
  257. "foo": []byte("bar"),
  258. },
  259. },
  260. {
  261. name: "from & toJson func",
  262. tpl: map[string][]byte{
  263. "foo": []byte("{{ $var := .secret | fromJson }}{{ $var.foo | toJson }}"),
  264. },
  265. data: map[string][]byte{
  266. "secret": []byte(`{"foo": {"baz":"bang"}}`),
  267. },
  268. expectedData: map[string][]byte{
  269. "foo": []byte(`{"baz":"bang"}`),
  270. },
  271. },
  272. {
  273. name: "fromJson & toYaml func",
  274. tpl: map[string][]byte{
  275. "foo": []byte("{{ $var := .secret | fromJson | toYaml }}{{ $var }}"),
  276. },
  277. data: map[string][]byte{
  278. "secret": []byte(`{"foo": "bar"}`),
  279. },
  280. expectedData: map[string][]byte{
  281. "foo": []byte(`foo: bar`),
  282. },
  283. },
  284. {
  285. name: "fromYaml & toJson func",
  286. tpl: map[string][]byte{
  287. "foo": []byte("{{ $var := .secret | fromYaml | toJson }}{{ $var }}"),
  288. },
  289. data: map[string][]byte{
  290. "secret": []byte(`foo: bar`),
  291. },
  292. expectedData: map[string][]byte{
  293. "foo": []byte(`{"foo":"bar"}`),
  294. },
  295. },
  296. {
  297. name: "use sprig functions",
  298. tpl: map[string][]byte{
  299. "foo": []byte(`{{ .path | ext }}`),
  300. },
  301. data: map[string][]byte{
  302. "path": []byte(`foo/bar/baz.exe`),
  303. },
  304. expectedData: map[string][]byte{
  305. "foo": []byte(`.exe`),
  306. },
  307. },
  308. {
  309. name: "use replace function",
  310. tpl: map[string][]byte{
  311. "foo": []byte(`{{ .conn | replace "postgres://" "db+postgresql://"}}`),
  312. },
  313. data: map[string][]byte{
  314. "conn": []byte(`postgres://user:pass@db.host:5432/dbname`),
  315. },
  316. expectedData: map[string][]byte{
  317. "foo": []byte(`db+postgresql://user:pass@db.host:5432/dbname`),
  318. },
  319. },
  320. {
  321. name: "use upper function",
  322. tpl: map[string][]byte{
  323. "foo": []byte(`{{ .value | upper }}`),
  324. },
  325. data: map[string][]byte{
  326. "value": []byte(`username`),
  327. },
  328. expectedData: map[string][]byte{
  329. "foo": []byte(`USERNAME`),
  330. },
  331. },
  332. {
  333. name: "multiline template",
  334. tpl: map[string][]byte{
  335. "cfg": []byte(`
  336. datasources:
  337. - name: Graphite
  338. type: graphite
  339. access: proxy
  340. url: http://localhost:8080
  341. password: "{{ .password }}"
  342. user: "{{ .user }}"`),
  343. },
  344. data: map[string][]byte{
  345. "user": []byte(`foobert`),
  346. "password": []byte("harharhar"),
  347. },
  348. expectedData: map[string][]byte{
  349. "cfg": []byte(`
  350. datasources:
  351. - name: Graphite
  352. type: graphite
  353. access: proxy
  354. url: http://localhost:8080
  355. password: "harharhar"
  356. user: "foobert"`),
  357. },
  358. },
  359. {
  360. name: "base64 pipeline",
  361. tpl: map[string][]byte{
  362. "foo": []byte(`{{ "123412341234" | b64enc | b64dec }}`),
  363. },
  364. data: map[string][]byte{},
  365. expectedData: map[string][]byte{
  366. "foo": []byte("123412341234"),
  367. },
  368. },
  369. {
  370. name: "base64 pkcs12 extract",
  371. tpl: map[string][]byte{
  372. "key": []byte(`{{ .secret | b64dec | pkcs12key }}`),
  373. "cert": []byte(`{{ .secret | b64dec | pkcs12cert }}`),
  374. },
  375. data: map[string][]byte{
  376. "secret": []byte(pkcs12ContentNoPass),
  377. },
  378. expectedData: map[string][]byte{
  379. "key": []byte(pkcs12Key),
  380. "cert": []byte(pkcs12Cert),
  381. },
  382. },
  383. {
  384. name: "base64 pkcs12 extract with password",
  385. tpl: map[string][]byte{
  386. "key": []byte(`{{ .secret | b64dec | pkcs12keyPass "123456" }}`),
  387. "cert": []byte(`{{ .secret | b64dec | pkcs12certPass "123456" }}`),
  388. },
  389. data: map[string][]byte{
  390. "secret": []byte(pkcs12ContentWithPass),
  391. },
  392. expectedData: map[string][]byte{
  393. "key": []byte(pkcs12Key),
  394. "cert": []byte(pkcs12Cert),
  395. },
  396. },
  397. {
  398. name: "base64 decode error",
  399. tpl: map[string][]byte{
  400. "key": []byte(`{{ .example | b64dec }}`),
  401. },
  402. data: map[string][]byte{
  403. "example": []byte("iam_no_base64"),
  404. },
  405. expErr: "", // silent error
  406. },
  407. {
  408. name: "pkcs12 key wrong password",
  409. tpl: map[string][]byte{
  410. "key": []byte(`{{ .secret | b64dec | pkcs12keyPass "wrong" }}`),
  411. },
  412. data: map[string][]byte{
  413. "secret": []byte(pkcs12ContentWithPass),
  414. },
  415. expErr: "unable to decode pkcs12",
  416. },
  417. {
  418. name: "pkcs12 cert wrong password",
  419. tpl: map[string][]byte{
  420. "cert": []byte(`{{ .secret | b64dec | pkcs12certPass "wrong" }}`),
  421. },
  422. data: map[string][]byte{
  423. "secret": []byte(pkcs12ContentWithPass),
  424. },
  425. expErr: "unable to decode pkcs12",
  426. },
  427. {
  428. name: "fromJson error",
  429. tpl: map[string][]byte{
  430. "key": []byte(`{{ "{ # no json # }" | fromJson }}`),
  431. },
  432. data: map[string][]byte{},
  433. expErr: "", // silent error
  434. },
  435. {
  436. name: "template syntax error",
  437. tpl: map[string][]byte{
  438. "key": []byte(`{{ #xx }}`),
  439. },
  440. data: map[string][]byte{},
  441. expErr: "unable to parse template",
  442. },
  443. {
  444. name: "unknown key error",
  445. tpl: map[string][]byte{
  446. "key": []byte(`{{ .unknown }}`),
  447. },
  448. data: map[string][]byte{},
  449. expErr: "unable to execute template at key key",
  450. },
  451. {
  452. name: "jwk rsa pub pem",
  453. tpl: map[string][]byte{
  454. "fn": []byte(`{{ .secret | jwkPublicKeyPem }}`),
  455. },
  456. data: map[string][]byte{
  457. "secret": []byte(jwkPubRSA),
  458. },
  459. expectedData: map[string][]byte{
  460. "fn": []byte(jwkPubRSAPKIX),
  461. },
  462. },
  463. {
  464. name: "jwk rsa priv pem",
  465. tpl: map[string][]byte{
  466. "fn": []byte(`{{ .secret | jwkPrivateKeyPem }}`),
  467. },
  468. data: map[string][]byte{
  469. "secret": []byte(jwkPrivRSA),
  470. },
  471. expectedData: map[string][]byte{
  472. "fn": []byte(jwkPrivRSAPKCS8),
  473. },
  474. },
  475. {
  476. name: "jwk ecdsa pub pem",
  477. tpl: map[string][]byte{
  478. "fn": []byte(`{{ .secret | jwkPublicKeyPem }}`),
  479. },
  480. data: map[string][]byte{
  481. "secret": []byte(jwkPubEC),
  482. },
  483. expectedData: map[string][]byte{
  484. "fn": []byte(jwkPubECPKIX),
  485. },
  486. },
  487. {
  488. name: "jwk ecdsa priv pem",
  489. tpl: map[string][]byte{
  490. "fn": []byte(`{{ .secret | jwkPrivateKeyPem }}`),
  491. },
  492. data: map[string][]byte{
  493. "secret": []byte(jwkPrivEC),
  494. },
  495. expectedData: map[string][]byte{
  496. "fn": []byte(jwkPrivECPKCS8),
  497. },
  498. },
  499. {
  500. name: "filter pem certificate",
  501. tpl: map[string][]byte{
  502. "fn": []byte(`{{ .secret | filterPEM "CERTIFICATE" }}`),
  503. },
  504. data: map[string][]byte{
  505. "secret": []byte(jwkPrivRSAPKCS8 + pkcs12Cert),
  506. },
  507. expectedData: map[string][]byte{
  508. "fn": []byte(pkcs12Cert),
  509. },
  510. },
  511. {
  512. name: "labels",
  513. tpl: map[string][]byte{
  514. "foo": []byte("{{ .secret | b64dec }}"),
  515. },
  516. labelsTpl: map[string][]byte{
  517. "bar": []byte("{{ .env | b64dec }}"),
  518. },
  519. data: map[string][]byte{
  520. "secret": []byte("MTIzNA=="),
  521. "env": []byte("ZGV2"),
  522. },
  523. expectedData: map[string][]byte{
  524. "foo": []byte("1234"),
  525. },
  526. expectedLabels: map[string]string{
  527. "bar": "dev",
  528. },
  529. },
  530. {
  531. name: "annotations",
  532. tpl: map[string][]byte{
  533. "foo": []byte("{{ .secret | b64dec }}"),
  534. },
  535. annotationsTpl: map[string][]byte{
  536. "bar": []byte("{{ .env | b64dec }}"),
  537. },
  538. data: map[string][]byte{
  539. "secret": []byte("MTIzNA=="),
  540. "env": []byte("ZGV2"),
  541. },
  542. expectedData: map[string][]byte{
  543. "foo": []byte("1234"),
  544. },
  545. expectedAnnotations: map[string]string{
  546. "bar": "dev",
  547. },
  548. },
  549. {
  550. name: "stringData",
  551. stringDataTpl: map[string][]byte{
  552. "foo": []byte("{{ .secret | b64dec }}"),
  553. },
  554. data: map[string][]byte{
  555. "secret": []byte("MTIzNA=="),
  556. "env": []byte("ZGV2"),
  557. },
  558. expectedStringData: map[string]string{
  559. "foo": "1234",
  560. },
  561. },
  562. {
  563. name: "NonStandardDelimiters",
  564. stringDataTpl: map[string][]byte{
  565. "foo": []byte("<< .secret | b64dec >>"),
  566. },
  567. leftDelimiter: "<<",
  568. rightDelimiter: ">>",
  569. data: map[string][]byte{
  570. "secret": []byte("MTIzNA=="),
  571. "env": []byte("ZGV2"),
  572. },
  573. expectedStringData: map[string]string{
  574. "foo": "1234",
  575. },
  576. },
  577. {
  578. name: "rsa decrypt rsa-oaep sha1 pkcs8 data base64",
  579. tpl: map[string][]byte{
  580. "data_decrypted": []byte(`{{ .private_key | rsaDecrypt "RSA-OAEP" "SHA1" (.data_crypted_base64 | b64dec) }}`),
  581. },
  582. data: map[string][]byte{
  583. "private_key": []byte(rsaDecryptPKRSAPKCS8),
  584. "data_crypted_base64": []byte(rsaDecryptDataPKCS8Base64),
  585. },
  586. expectedData: map[string][]byte{
  587. "data_decrypted": []byte("a1b2c3d4"),
  588. },
  589. },
  590. {
  591. name: "rsa decrypt rsa-oaep sha256 pkcs1 data base64",
  592. tpl: map[string][]byte{
  593. "data_decrypted": []byte(`{{ .private_key | rsaDecrypt "RSA-OAEP" "SHA256" (.data_crypted_base64 | b64dec) }}`),
  594. },
  595. data: map[string][]byte{
  596. "private_key": []byte(rsaDecryptPKRSAPKCS1),
  597. "data_crypted_base64": []byte(rsaDecryptDataPKCS1Base64),
  598. },
  599. expectedData: map[string][]byte{
  600. "data_decrypted": []byte("hellopkcs1sha256"),
  601. },
  602. },
  603. {
  604. name: "rsa decrypt rsa-oaep sha256 pkcs1 data bin",
  605. tpl: map[string][]byte{
  606. "data_decrypted": []byte(`{{ .private_key | rsaDecrypt "RSA-OAEP" "SHA256" .data_crypted_bin }}`),
  607. },
  608. data: map[string][]byte{
  609. "private_key": []byte(rsaDecryptPKRSAPKCS1),
  610. "data_crypted_bin": rsaEncryptOAEP(t, []byte(rsaDecryptPubKeyRSAPKCS1), "SHA256", "hellopkcs1sha256"),
  611. },
  612. expectedData: map[string][]byte{
  613. "data_decrypted": []byte("hellopkcs1sha256"),
  614. },
  615. },
  616. }
  617. for i := range tbl {
  618. row := tbl[i]
  619. t.Run(row.name, func(t *testing.T) {
  620. sec := &corev1.Secret{
  621. Data: make(map[string][]byte),
  622. StringData: make(map[string]string),
  623. ObjectMeta: v1.ObjectMeta{Labels: make(map[string]string), Annotations: make(map[string]string)},
  624. }
  625. oldLeftDelim := leftDelim
  626. oldRightDelim := rightDelim
  627. if row.leftDelimiter != "" {
  628. leftDelim = row.leftDelimiter
  629. }
  630. if row.rightDelimiter != "" {
  631. rightDelim = row.rightDelimiter
  632. }
  633. defer func() {
  634. leftDelim = oldLeftDelim
  635. rightDelim = oldRightDelim
  636. }()
  637. err := Execute(row.tpl, row.data, esapi.TemplateScopeValues, esapi.TemplateTargetData, sec)
  638. if !ErrorContains(err, row.expErr) {
  639. t.Errorf("unexpected error: %s, expected: %s", err, row.expErr)
  640. }
  641. err = Execute(row.labelsTpl, row.data, esapi.TemplateScopeValues, esapi.TemplateTargetLabels, sec)
  642. if !ErrorContains(err, row.expLblErr) {
  643. t.Errorf("unexpected error: %s, expected: %s", err, row.expErr)
  644. }
  645. err = Execute(row.annotationsTpl, row.data, esapi.TemplateScopeValues, esapi.TemplateTargetAnnotations, sec)
  646. if !ErrorContains(err, row.expAnnoErr) {
  647. t.Errorf("unexpected error: %s, expected: %s", err, row.expErr)
  648. }
  649. if row.expectedData != nil {
  650. assert.EqualValues(t, row.expectedData, sec.Data)
  651. }
  652. if row.expectedLabels != nil {
  653. assert.EqualValues(t, row.expectedLabels, sec.ObjectMeta.Labels)
  654. }
  655. if row.expectedAnnotations != nil {
  656. assert.EqualValues(t, row.expectedAnnotations, sec.ObjectMeta.Annotations)
  657. }
  658. })
  659. }
  660. }
  661. func TestScopeValuesWithSecretFieldsNil(t *testing.T) {
  662. tbl := []struct {
  663. name string
  664. tpl map[string][]byte
  665. target esapi.TemplateTarget
  666. data map[string][]byte
  667. expectedData map[string][]byte
  668. expectedStringData map[string]string
  669. expErr string
  670. }{
  671. {
  672. name: "test empty",
  673. tpl: map[string][]byte{},
  674. target: esapi.TemplateTargetData,
  675. data: nil,
  676. },
  677. {
  678. name: "test byte",
  679. tpl: map[string][]byte{"foo": []byte("bar")},
  680. target: esapi.TemplateTargetData,
  681. data: map[string][]byte{
  682. "key": []byte("foo"),
  683. "value": []byte("bar"),
  684. },
  685. expectedData: map[string][]byte{
  686. "foo": []byte("bar"),
  687. },
  688. },
  689. {
  690. name: "test Annotations",
  691. tpl: map[string][]byte{"foo": []byte("bar")},
  692. target: esapi.TemplateTargetAnnotations,
  693. data: map[string][]byte{
  694. "key": []byte("foo"),
  695. "value": []byte("bar"),
  696. },
  697. expectedStringData: map[string]string{
  698. "foo": "bar",
  699. },
  700. },
  701. {
  702. name: "test Labels",
  703. tpl: map[string][]byte{"foo": []byte("bar")},
  704. target: esapi.TemplateTargetLabels,
  705. data: map[string][]byte{
  706. "key": []byte("foo"),
  707. "value": []byte("bar"),
  708. },
  709. expectedStringData: map[string]string{
  710. "foo": "bar",
  711. },
  712. },
  713. }
  714. for i := range tbl {
  715. row := tbl[i]
  716. t.Run(row.name, func(t *testing.T) {
  717. sec := &corev1.Secret{}
  718. err := Execute(row.tpl, row.data, esapi.TemplateScopeValues, row.target, sec)
  719. if !ErrorContains(err, row.expErr) {
  720. t.Errorf("unexpected error: %s, expected: %s", err, row.expErr)
  721. }
  722. switch row.target {
  723. case esapi.TemplateTargetData:
  724. if row.expectedData != nil {
  725. assert.EqualValues(t, row.expectedData, sec.Data)
  726. }
  727. case esapi.TemplateTargetLabels:
  728. if row.expectedStringData != nil {
  729. assert.EqualValues(t, row.expectedStringData, sec.Labels)
  730. }
  731. case esapi.TemplateTargetAnnotations:
  732. if row.expectedStringData != nil {
  733. assert.EqualValues(t, row.expectedStringData, sec.Annotations)
  734. }
  735. }
  736. })
  737. }
  738. }
  739. func TestExecuteInvalidTemplateScope(t *testing.T) {
  740. sec := &corev1.Secret{}
  741. err := Execute(map[string][]byte{"foo": []byte("bar")}, nil, "invalid", esapi.TemplateTargetData, sec)
  742. require.Error(t, err)
  743. assert.ErrorContains(t, err, "expected 'Values' or 'KeysAndValues'")
  744. }
  745. func TestScopeKeysAndValues(t *testing.T) {
  746. tbl := []struct {
  747. name string
  748. tpl map[string][]byte
  749. target esapi.TemplateTarget
  750. data map[string][]byte
  751. expectedData map[string][]byte
  752. expectedStringData map[string]string
  753. expErr string
  754. }{
  755. {
  756. name: "test empty",
  757. tpl: map[string][]byte{"literal": []byte("")},
  758. target: "Data",
  759. data: nil,
  760. },
  761. {
  762. name: "test base64",
  763. tpl: map[string][]byte{"literal": []byte("{{ .key }}: {{ .value }}")},
  764. target: esapi.TemplateTargetData,
  765. data: map[string][]byte{
  766. "key": []byte("foo"),
  767. "value": []byte("bar"),
  768. },
  769. expectedData: map[string][]byte{
  770. "foo": []byte("bar"),
  771. },
  772. },
  773. {
  774. name: "test Annotations",
  775. tpl: map[string][]byte{"literal": []byte("{{ .key }}: {{ .value }}")},
  776. target: esapi.TemplateTargetAnnotations,
  777. data: map[string][]byte{
  778. "key": []byte("foo"),
  779. "value": []byte("bar"),
  780. },
  781. expectedStringData: map[string]string{
  782. "foo": "bar",
  783. },
  784. },
  785. {
  786. name: "test Labels",
  787. tpl: map[string][]byte{"literal": []byte("{{ .key }}: {{ .value }}")},
  788. target: esapi.TemplateTargetLabels,
  789. data: map[string][]byte{
  790. "key": []byte("foo"),
  791. "value": []byte("bar"),
  792. },
  793. expectedStringData: map[string]string{
  794. "foo": "bar",
  795. },
  796. },
  797. }
  798. for i := range tbl {
  799. row := tbl[i]
  800. t.Run(row.name, func(t *testing.T) {
  801. sec := &corev1.Secret{
  802. Data: make(map[string][]byte),
  803. StringData: make(map[string]string),
  804. ObjectMeta: v1.ObjectMeta{Labels: make(map[string]string), Annotations: make(map[string]string)},
  805. }
  806. err := Execute(row.tpl, row.data, esapi.TemplateScopeKeysAndValues, row.target, sec)
  807. if !ErrorContains(err, row.expErr) {
  808. t.Errorf("unexpected error: %s, expected: %s", err, row.expErr)
  809. }
  810. switch row.target {
  811. case esapi.TemplateTargetData:
  812. if row.expectedData != nil {
  813. assert.EqualValues(t, row.expectedData, sec.Data)
  814. }
  815. case esapi.TemplateTargetLabels:
  816. if row.expectedStringData != nil {
  817. assert.EqualValues(t, row.expectedStringData, sec.Labels)
  818. }
  819. case esapi.TemplateTargetAnnotations:
  820. if row.expectedStringData != nil {
  821. assert.EqualValues(t, row.expectedStringData, sec.Annotations)
  822. }
  823. }
  824. })
  825. }
  826. }
  827. func ErrorContains(out error, want string) bool {
  828. if out == nil {
  829. return want == ""
  830. }
  831. if want == "" {
  832. return false
  833. }
  834. return strings.Contains(out.Error(), want)
  835. }
  836. func TestPkcs12certPass(t *testing.T) {
  837. const (
  838. leafCertPath = "_testdata/foo.crt"
  839. intermediateCertPath = "_testdata/intermediate-ca.crt"
  840. rootCertPath = "_testdata/root-ca.crt"
  841. disjunctCertPath = "_testdata/disjunct-root-ca.crt"
  842. )
  843. type args struct {
  844. pass string
  845. filename string
  846. }
  847. type testCase struct {
  848. name string
  849. args args
  850. want []string
  851. wantErr bool
  852. }
  853. tests := []testCase{
  854. {
  855. // this case expects the whole chain to be stored
  856. // in a single bag.
  857. // bag(1): leaf/root/intermediate cert
  858. // bag(2): private key
  859. name: "read file without password",
  860. args: args{
  861. pass: "",
  862. filename: "_testdata/foo-nopass.pfx",
  863. },
  864. want: []string{
  865. // this order is important
  866. leafCertPath,
  867. intermediateCertPath,
  868. rootCertPath,
  869. },
  870. },
  871. {
  872. // same as above but with password
  873. name: "read file with password",
  874. args: args{
  875. pass: "1234",
  876. filename: "_testdata/foo-withpass-1234.pfx",
  877. },
  878. want: []string{
  879. // this order is important
  880. leafCertPath,
  881. intermediateCertPath,
  882. rootCertPath,
  883. },
  884. },
  885. {
  886. // cert chain may be stored in different bags
  887. // this test case uses a pfx that has the following structure:
  888. // bag(1): leaf certificate
  889. // bag(2): root + intermediate cert
  890. // bag(3): private key
  891. name: "read multibag cert chain",
  892. args: args{
  893. pass: "",
  894. filename: "_testdata/foo-multibag-nopass.pfx",
  895. },
  896. want: []string{
  897. // this order is important
  898. leafCertPath,
  899. intermediateCertPath,
  900. rootCertPath,
  901. },
  902. },
  903. {
  904. // cert chain may contain a disjunct cert
  905. // bag(1): leaf/root/intermediate/disjunct
  906. // bag(2): private key
  907. name: "read disjunct cert chain",
  908. args: args{
  909. pass: "",
  910. filename: "_testdata/foo-disjunct-nopass.pfx",
  911. },
  912. want: []string{
  913. // this order is important
  914. leafCertPath,
  915. rootCertPath,
  916. intermediateCertPath,
  917. disjunctCertPath,
  918. },
  919. },
  920. {
  921. name: "read file wrong password",
  922. args: args{
  923. pass: "wrongpass",
  924. filename: "_testdata/foo-withpass-1234.pfx",
  925. },
  926. wantErr: true,
  927. },
  928. }
  929. testFunc := func(t *testing.T, tc testCase) {
  930. archive, err := os.ReadFile(tc.args.filename)
  931. if err != nil {
  932. t.Error(err)
  933. }
  934. var expOut []byte
  935. for _, w := range tc.want {
  936. c, err := os.ReadFile(w)
  937. if err != nil {
  938. t.Error(err)
  939. }
  940. expOut = append(expOut, c...)
  941. }
  942. got, err := pkcs12certPass(tc.args.pass, string(archive))
  943. if (err != nil) != tc.wantErr {
  944. t.Errorf("pkcs12certPass() error = %v, wantErr %v", err, tc.wantErr)
  945. return
  946. }
  947. if diff := cmp.Diff(string(expOut), got); diff != "" {
  948. t.Errorf("pkcs12certPass() = diff:\n%s", diff)
  949. }
  950. }
  951. for _, tt := range tests {
  952. t.Run(tt.name, func(t *testing.T) {
  953. testFunc(t, tt)
  954. })
  955. }
  956. }