Skip to content

Commit f48ae0e

Browse files
authored
Merge pull request #78 from awnumar/master
Update memguard to latest version and patch bugs
2 parents a7edeac + 2ed2185 commit f48ae0e

File tree

5 files changed

+66
-96
lines changed

5 files changed

+66
-96
lines changed

cmd/mole/main.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,9 @@ var version = "unversioned"
1919
var instancesDir string
2020

2121
func main() {
22-
2322
// memguard is used to securely keep sensitive information in memory.
2423
// This call makes sure all data will be destroy when the program exits.
25-
defer memguard.DestroyAll()
24+
defer memguard.Purge()
2625

2726
app := cli.New(os.Args)
2827
err := app.Parse()

go.mod

+7-19
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,16 @@ go 1.12
44

55
require (
66
github.com/BurntSushi/toml v0.3.1
7-
github.com/awnumar/memguard v0.15.1
8-
github.com/davidrjenni/reftools v0.0.0-20190411195930-981bbac422f8 // indirect
9-
github.com/fatih/gomodifytags v0.0.0-20190517204355-df91c5bc7551 // indirect
10-
github.com/fatih/motion v0.0.0-20180408211639-218875ebe238 // indirect
11-
github.com/josharian/impl v0.0.0-20180228163738-3d0f908298c4 // indirect
12-
github.com/jstemmer/gotags v1.4.1 // indirect
13-
github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e
14-
github.com/klauspost/asmfmt v1.2.0 // indirect
15-
github.com/koron/iferr v0.0.0-20180615142939-bb332a3b1d91 // indirect
7+
github.com/awnumar/memguard v0.17.1
8+
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
9+
github.com/kevinburke/ssh_config v0.0.0-20190630040420-2e50c441276c
10+
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
1611
github.com/kr/pretty v0.1.0 // indirect
17-
github.com/mdempsky/gocode v0.0.0-20190203001940-7fb65232883f // indirect
1812
github.com/pelletier/go-buffruneio v0.2.0 // indirect
19-
github.com/rogpeppe/godef v1.1.1 // indirect
2013
github.com/satori/go.uuid v1.2.0
2114
github.com/sevlyar/go-daemon v0.1.5
22-
github.com/sirupsen/logrus v1.4.1
23-
github.com/zmb3/gogetdoc v0.0.0-20190228002656-b37376c5da6a // indirect
24-
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f
25-
golang.org/x/net v0.0.0-20190520210107-018c4d40a106 // indirect
26-
golang.org/x/sys v0.0.0-20190520201301-c432e742b0af // indirect
27-
golang.org/x/text v0.3.2 // indirect
28-
golang.org/x/tools v0.0.0-20190521171243-7927dbab1be7 // indirect
15+
github.com/sirupsen/logrus v1.4.2
16+
github.com/stretchr/testify v1.3.0 // indirect
17+
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4
2918
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
30-
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a // indirect
3119
)

go.sum

+20-51
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,50 @@
1-
9fans.net/go v0.0.0-20181112161441-237454027057 h1:OcHlKWkAMJEF1ndWLGxp5dnJQkYM/YImUOvsBoz6h5E=
2-
9fans.net/go v0.0.0-20181112161441-237454027057/go.mod h1:diCsxrliIURU9xsYtjCp5AbpQKqdhKmf0ujWDUSkfoY=
31
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
42
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
5-
github.com/awnumar/memguard v0.15.1 h1:RDPYo+e6rm65NLKJqmSVQpO9LuLh7R/hfC6Ed3ahbEU=
6-
github.com/awnumar/memguard v0.15.1/go.mod h1:77EUD6uwfgcd6zTmn++i5ujEFviGRQfE8ELbDJO1rpA=
3+
github.com/awnumar/memguard v0.17.1 h1:A+LXGWDm55TFXwm8k3S8fy0XqC+2GptdLPGpTBSjjlo=
4+
github.com/awnumar/memguard v0.17.1/go.mod h1:s8LpRI3oAAgcbfLEN4lRsDqJoDVVW2J52y8ED5sl8ug=
5+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
76
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
87
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9-
github.com/davidrjenni/reftools v0.0.0-20190411195930-981bbac422f8 h1:Eu7kPTwAOeiiot8fjH/WXIYSsoaYB7Xs7sPF8NYeKhs=
10-
github.com/davidrjenni/reftools v0.0.0-20190411195930-981bbac422f8/go.mod h1:0qWLWApvobxwtd9/A8fS62VkRImuquIgtCv/ye+KnxA=
11-
github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8=
12-
github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc=
13-
github.com/fatih/gomodifytags v0.0.0-20190517204355-df91c5bc7551 h1:/fvatMHXeYKMzBfS7ZAWJxAUVdNvorVap9/T7agWgW8=
14-
github.com/fatih/gomodifytags v0.0.0-20190517204355-df91c5bc7551/go.mod h1:p2/x7bnOQsbq/deXsDIlj2yLiKFGPkD2nuoYqwn8R4Y=
15-
github.com/fatih/motion v0.0.0-20180408211639-218875ebe238 h1:Qo4RxRMFag+fvDqQ6A3MblYBormptQUZ1ssOtV+EeQ8=
16-
github.com/fatih/motion v0.0.0-20180408211639-218875ebe238/go.mod h1:pseIrV+t9A4+po+KJ1LheSnYH8m1qs6WhKx2zFiGi9I=
17-
github.com/fatih/structtag v1.0.0 h1:pTHj65+u3RKWYPSGaU290FpI/dXxTaHdVwVwbcPKmEc=
18-
github.com/fatih/structtag v1.0.0/go.mod h1:IKitwq45uXL/yqi5mYghiD3w9H6eTOvI9vnk8tXMphA=
19-
github.com/josharian/impl v0.0.0-20180228163738-3d0f908298c4 h1:gmIVMdGlVf5e6Yo6+ZklxdOrvtOvyrAjJyXAbmOznyo=
20-
github.com/josharian/impl v0.0.0-20180228163738-3d0f908298c4/go.mod h1:t4Tr0tn92eq5ISef4cS5plFAMYAqZlAXtgUcKE6y8nw=
21-
github.com/jstemmer/gotags v1.4.1 h1:aWIyXsU3lTDqhsEC49MP85p2cUUWr2ptvdGNqqGA3r4=
22-
github.com/jstemmer/gotags v1.4.1/go.mod h1:b6J3X0bsLbR4C5SgSx3V3KjuWTtmRzcmWPbTkWZ49PA=
23-
github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e h1:RgQk53JHp/Cjunrr1WlsXSZpqXn+uREuHvUVcK82CV8=
24-
github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
25-
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
26-
github.com/klauspost/asmfmt v1.2.0 h1:zwsyBYgEdabg32alMful/5pRtMTcR5C5w1LKNg9OD78=
27-
github.com/klauspost/asmfmt v1.2.0/go.mod h1:RAoUvqkWr2rUa2I19qKMEVZQe4BVtcHGTMCUOcCU2Lg=
8+
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA=
9+
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
10+
github.com/kevinburke/ssh_config v0.0.0-20190630040420-2e50c441276c h1:VAx3LRNjVNvjtgO7KFRuT/3aye/0zJvwn01rHSfoolo=
11+
github.com/kevinburke/ssh_config v0.0.0-20190630040420-2e50c441276c/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
2812
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
2913
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
30-
github.com/koron/iferr v0.0.0-20180615142939-bb332a3b1d91 h1:hunjgdb3b21ZdRmzDPXii0EcnHpjH7uCP+kODoE1JH0=
31-
github.com/koron/iferr v0.0.0-20180615142939-bb332a3b1d91/go.mod h1:C2tFh8w3I6i4lnUJfoBx2Hwku3mgu4wPNTtUNp1i5KI=
14+
github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
15+
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
3216
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
3317
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
3418
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
3519
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
3620
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
37-
github.com/mdempsky/gocode v0.0.0-20190203001940-7fb65232883f h1:ee+twVCignaZjt7jpbMSLxAeTN/Nfq9W/nm91E7QO1A=
38-
github.com/mdempsky/gocode v0.0.0-20190203001940-7fb65232883f/go.mod h1:hltEC42XzfMNgg0S1v6JTywwra2Mu6F6cLR03debVQ8=
3921
github.com/pelletier/go-buffruneio v0.2.0 h1:U4t4R6YkofJ5xHm3dJzuRpPZ0mr5MMCoAWooScCR7aA=
4022
github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo=
4123
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
4224
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
43-
github.com/rogpeppe/godef v1.1.1 h1:NujOtt9q9vIClRTB3sCZpavac+NMRaIayzrcz1h4fSE=
44-
github.com/rogpeppe/godef v1.1.1/go.mod h1:oEo1eMy1VUEHUzUIX4F7IqvMJRiz9UId44mvnR8oPlQ=
4525
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
4626
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
4727
github.com/sevlyar/go-daemon v0.1.5 h1:Zy/6jLbM8CfqJ4x4RPr7MJlSKt90f00kNM1D401C+Qk=
4828
github.com/sevlyar/go-daemon v0.1.5/go.mod h1:6dJpPatBT9eUwM5VCw9Bt6CdX9Tk6UWvhW3MebLDRKE=
49-
github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
50-
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
29+
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
30+
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
31+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
5132
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
5233
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
5334
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
54-
github.com/zmb3/gogetdoc v0.0.0-20190228002656-b37376c5da6a h1:00UFliGZl2UciXe8o/2iuEsRQ9u7z0rzDTVzuj6EYY0=
55-
github.com/zmb3/gogetdoc v0.0.0-20190228002656-b37376c5da6a/go.mod h1:ofmGw6LrMypycsiWcyug6516EXpIxSbZ+uI9ppGypfY=
35+
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
36+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
5637
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
57-
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo=
58-
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
59-
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
38+
golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
39+
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc=
40+
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
6041
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
61-
golang.org/x/net v0.0.0-20190520210107-018c4d40a106/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
62-
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
63-
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
6442
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
6543
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
6644
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
67-
golang.org/x/sys v0.0.0-20190520201301-c432e742b0af h1:NXfmMfXz6JqGfG3ikSxcz2N93j6DgScr19Oo2uwFu88=
68-
golang.org/x/sys v0.0.0-20190520201301-c432e742b0af/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
45+
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
46+
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k=
47+
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
6948
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
70-
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
71-
golang.org/x/tools v0.0.0-20180824175216-6c1c5e93cdc1/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
72-
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
73-
golang.org/x/tools v0.0.0-20181130195746-895048a75ecf/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
74-
golang.org/x/tools v0.0.0-20181207195948-8634b1ecd393/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
75-
golang.org/x/tools v0.0.0-20190408220357-e5b8258f4918/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
76-
golang.org/x/tools v0.0.0-20190521171243-7927dbab1be7 h1:+ef02iDoPU4j54NNvxgyVjdhaWHJ4da+lhWX18ayOok=
77-
golang.org/x/tools v0.0.0-20190521171243-7927dbab1be7/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
7849
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
7950
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
80-
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a h1:LJwr7TCTghdatWv40WobzlKXc9c4s8oGa7QKJUtHhWA=
81-
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

tunnel/key.go

+16-22
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,7 @@ func NewPemKey(keyPath, passphrase string) (*PemKey, error) {
3535
k := &PemKey{Data: data}
3636

3737
if passphrase != "" {
38-
err = k.updatePassphrase([]byte(passphrase))
39-
if err != nil {
40-
return nil, err
41-
}
38+
k.updatePassphrase([]byte(passphrase))
4239
}
4340

4441
return k, nil
@@ -66,11 +63,11 @@ func (k *PemKey) Parse() (ssh.Signer, error) {
6663
}
6764

6865
if enc {
69-
if len(k.passphrase.Buffer()) == 0 {
70-
return nil, fmt.Errorf("can't read protected ssh key because no passphrase was not provided")
66+
if k.passphrase == nil {
67+
return nil, fmt.Errorf("can't read protected ssh key because no passphrase was provided")
7168
}
7269

73-
signer, err = ssh.ParsePrivateKeyWithPassphrase(k.Data, k.passphrase.Buffer())
70+
signer, err = ssh.ParsePrivateKeyWithPassphrase(k.Data, k.passphrase.Bytes())
7471
if err != nil {
7572
return nil, err
7673
}
@@ -86,8 +83,8 @@ func (k *PemKey) Parse() (ssh.Signer, error) {
8683

8784
// HandlePassphrase securely records a passphrase given by a callback to the
8885
// memory.
89-
func (pk *PemKey) HandlePassphrase(handler func() ([]byte, error)) error {
90-
enc, err := pk.IsEncrypted()
86+
func (k *PemKey) HandlePassphrase(handler func() ([]byte, error)) error {
87+
enc, err := k.IsEncrypted()
9188
if err != nil {
9289
return fmt.Errorf("error while reading ssh key: %v", err)
9390
}
@@ -101,25 +98,22 @@ func (pk *PemKey) HandlePassphrase(handler func() ([]byte, error)) error {
10198
return fmt.Errorf("error while reading password: %v", err)
10299
}
103100

104-
pk.updatePassphrase(pp)
101+
k.updatePassphrase(pp)
105102

106103
return nil
107104
}
108105

109-
func (pk *PemKey) updatePassphrase(pp []byte) error {
110-
if pk.passphrase == nil {
111-
lb, err := memguard.NewImmutableFromBytes([]byte(pp))
112-
if err != nil {
113-
return err
114-
}
115-
pk.passphrase = lb
116-
} else {
117-
if err := pk.passphrase.Move(pp); err != nil {
118-
return err
119-
}
106+
func (k *PemKey) updatePassphrase(pp []byte) {
107+
if k.passphrase != nil {
108+
k.passphrase.Destroy()
120109
}
121110

122-
return nil
111+
if len(pp) < 1 {
112+
k.passphrase = nil
113+
return
114+
}
115+
116+
k.passphrase = memguard.NewBufferFromBytes(pp)
123117
}
124118

125119
func decodePemKey(data []byte) (*pem.Block, error) {

tunnel/key_test.go

+22-2
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ func TestHandlePassword(t *testing.T) {
8282
}
8383

8484
if enc {
85-
if test.passphrase != string(key.passphrase.Buffer()) {
86-
t.Errorf("passphrases don't match for key %s: expected: %s, result: %s", test.keyPath, test.passphrase, string(key.passphrase.Buffer()))
85+
if test.passphrase != key.passphrase.String() {
86+
t.Errorf("passphrases don't match for key %s: expected: %s, result: %s", test.keyPath, test.passphrase, key.passphrase.String())
8787
}
8888
} else {
8989
if nil != key.passphrase {
@@ -92,3 +92,23 @@ func TestHandlePassword(t *testing.T) {
9292
}
9393
}
9494
}
95+
96+
func TestUpdatePassphrase(t *testing.T) {
97+
key, _ := NewPemKey("testdata/dotssh/id_rsa_encrypted", "mole")
98+
99+
key.updatePassphrase([]byte("hello"))
100+
if !key.passphrase.EqualTo([]byte("hello")) {
101+
t.Error("update failed")
102+
}
103+
104+
key = new(PemKey) // nil
105+
key.updatePassphrase([]byte("bye"))
106+
if !key.passphrase.EqualTo([]byte("bye")) {
107+
t.Error("update failed")
108+
}
109+
110+
key.updatePassphrase([]byte(""))
111+
if key.passphrase != nil {
112+
t.Error("expected nil passphrase")
113+
}
114+
}

0 commit comments

Comments
 (0)