Skip to content

Commit 9fc0329

Browse files
committed
update. #20 Allow builds to be done without cgo (pkcs11 will no longer be available).
1 parent e4e4090 commit 9fc0329

File tree

4 files changed

+97
-76
lines changed

4 files changed

+97
-76
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ go-sshlib
88
A library to handle ssh easily with Golang.It can do multiple proxy, x11 forwarding, etc.
99
Supported on Linux, macOS and Windows.
1010

11+
If use **pkcs11** authentication, cgo must be enabled.
12+
1113
* This program refactors the processing performed by lssh(https://github.com/blacknon/lssh) so that it can be treated as a library.
1214

1315
## Usage

auth.go

Lines changed: 0 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
"strings"
1919

2020
"github.com/ScaleFT/sshkeys"
21-
"github.com/miekg/pkcs11/p11"
2221
"golang.org/x/crypto/ssh"
2322
"golang.org/x/crypto/ssh/agent"
2423
)
@@ -166,80 +165,6 @@ func CreateSignerCertificate(cert string, keySigner ssh.Signer) (certSigner ssh.
166165
return
167166
}
168167

169-
// CreateAuthMethodPKCS11 return []ssh.AuthMethod generated from pkcs11 token.
170-
// PIN is required to generate a AuthMethod from a PKCS 11 token.
171-
//
172-
// WORNING: Does not work if multiple tokens are stuck at the same time.
173-
func CreateAuthMethodPKCS11(provider, pin string) (auth []ssh.AuthMethod, err error) {
174-
signers, err := CreateSignerPKCS11(provider, pin)
175-
if err != nil {
176-
return
177-
}
178-
179-
for _, signer := range signers {
180-
auth = append(auth, ssh.PublicKeys(signer))
181-
}
182-
return
183-
}
184-
185-
// CreateSignerPKCS11 returns []ssh.Signer generated from PKCS11 token.
186-
// PIN is required to generate a Signer from a PKCS 11 token.
187-
//
188-
// WORNING: Does not work if multiple tokens are stuck at the same time.
189-
func CreateSignerPKCS11(provider, pin string) (signers []ssh.Signer, err error) {
190-
// get absolute path
191-
provider = getAbsPath(provider)
192-
193-
// Create p11.module
194-
module, err := p11.OpenModule(provider)
195-
if err != nil {
196-
return
197-
}
198-
199-
// Get p11 Module's Slot
200-
slots, err := module.Slots()
201-
if err != nil {
202-
return
203-
}
204-
c11array := []*C11{}
205-
206-
for _, slot := range slots {
207-
tokenInfo, err := slot.TokenInfo()
208-
if err != nil {
209-
continue
210-
}
211-
212-
c := &C11{
213-
Label: tokenInfo.Label,
214-
PIN: pin,
215-
}
216-
c11array = append(c11array, c)
217-
}
218-
219-
// Destroy Module
220-
module.Destroy()
221-
222-
// for loop
223-
for _, c11 := range c11array {
224-
err := c11.CreateCtx(provider)
225-
if err != nil {
226-
continue
227-
}
228-
229-
sigs, err := c11.GetSigner()
230-
if err != nil {
231-
continue
232-
}
233-
234-
for _, sig := range sigs {
235-
signer, _ := ssh.NewSignerFromSigner(sig)
236-
signers = append(signers, signer)
237-
}
238-
}
239-
240-
return
241-
}
242-
243168
// CreateSignerAgent return []ssh.Signer from ssh-agent.
244169
// In sshAgent, put agent.Agent or agent.ExtendedAgent.
245170
func CreateSignerAgent(sshAgent interface{}) (signers []ssh.Signer, err error) {

auth_pkcs11.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// Copyright (c) 2021 Blacknon. All rights reserved.
2+
// Use of this source code is governed by an MIT license
3+
// that can be found in the LICENSE file.
4+
//go:build cgo
5+
// +build cgo
6+
7+
package sshlib
8+
9+
import (
10+
"github.com/miekg/pkcs11/p11"
11+
"golang.org/x/crypto/ssh"
12+
)
13+
14+
// CreateAuthMethodPKCS11 return []ssh.AuthMethod generated from pkcs11 token.
15+
// PIN is required to generate a AuthMethod from a PKCS 11 token.
16+
// Not available if cgo is disabled.
17+
//
18+
// WORNING: Does not work if multiple tokens are stuck at the same time.
19+
func CreateAuthMethodPKCS11(provider, pin string) (auth []ssh.AuthMethod, err error) {
20+
signers, err := CreateSignerPKCS11(provider, pin)
21+
if err != nil {
22+
return
23+
}
24+
25+
for _, signer := range signers {
26+
auth = append(auth, ssh.PublicKeys(signer))
27+
}
28+
return
29+
}
30+
31+
// CreateSignerPKCS11 returns []ssh.Signer generated from PKCS11 token.
32+
// PIN is required to generate a Signer from a PKCS 11 token.
33+
// Not available if cgo is disabled.
34+
//
35+
// WORNING: Does not work if multiple tokens are stuck at the same time.
36+
func CreateSignerPKCS11(provider, pin string) (signers []ssh.Signer, err error) {
37+
// get absolute path
38+
provider = getAbsPath(provider)
39+
40+
// Create p11.module
41+
module, err := p11.OpenModule(provider)
42+
if err != nil {
43+
return
44+
}
45+
46+
// Get p11 Module's Slot
47+
slots, err := module.Slots()
48+
if err != nil {
49+
return
50+
}
51+
c11array := []*C11{}
52+
53+
for _, slot := range slots {
54+
tokenInfo, err := slot.TokenInfo()
55+
if err != nil {
56+
continue
57+
}
58+
59+
c := &C11{
60+
Label: tokenInfo.Label,
61+
PIN: pin,
62+
}
63+
c11array = append(c11array, c)
64+
}
65+
66+
// Destroy Module
67+
module.Destroy()
68+
69+
// for loop
70+
for _, c11 := range c11array {
71+
err := c11.CreateCtx(provider)
72+
if err != nil {
73+
continue
74+
}
75+
76+
sigs, err := c11.GetSigner()
77+
if err != nil {
78+
continue
79+
}
80+
81+
for _, sig := range sigs {
82+
signer, _ := ssh.NewSignerFromSigner(sig)
83+
signers = append(signers, signer)
84+
}
85+
}
86+
87+
return
88+
}

pkcs11.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Copyright (c) 2020 Blacknon. All rights reserved.
22
// Use of this source code is governed by an MIT license
33
// that can be found in the LICENSE file.
4+
//go:build cgo
5+
// +build cgo
46

57
package sshlib
68

@@ -9,13 +11,15 @@ import (
911
)
1012

1113
// C11 struct for Crypto11 processing.
14+
// Not available if cgo is disabled.
1215
type C11 struct {
1316
Label string
1417
PIN string
1518
Ctx *crypto11.Context
1619
}
1720

1821
// getPIN is set token's PIN Code to c.PIN
22+
// Not available if cgo is disabled.
1923
func (c *C11) getPIN() (err error) {
2024
if c.PIN == "" {
2125
c.PIN, err = getPassphrase(c.Label + "'s PIN:")
@@ -25,6 +29,7 @@ func (c *C11) getPIN() (err error) {
2529
}
2630

2731
// CreateCtx is create crypto11.Context
32+
// Not available if cgo is disabled.
2833
func (c *C11) CreateCtx(provider string) (err error) {
2934
// Get PIN Code
3035
err = c.getPIN()
@@ -47,7 +52,8 @@ func (c *C11) CreateCtx(provider string) (err error) {
4752
return
4853
}
4954

50-
// GetSigner return []crypto11.Signer
55+
// GetSigner return []crypto11.Signer.
56+
// Not available if cgo is disabled.
5157
func (c *C11) GetSigner() (signer []crypto11.Signer, err error) {
5258
return c.Ctx.FindAllKeyPairs()
5359
}

0 commit comments

Comments
 (0)