Skip to content
This repository was archived by the owner on Apr 25, 2025. It is now read-only.

Commit 4fadae5

Browse files
sudeshrshettytroyronda
authored andcommitted
[FAB-11135] pinning scripts for pkcs11 object handle
Change-Id: I5dcb195648a72f2c61438654d0a945fb6b30d614 Signed-off-by: Sudesh Shetty <sudesh.shetty@securekey.com>
1 parent b564dd5 commit 4fadae5

File tree

3 files changed

+49
-85
lines changed

3 files changed

+49
-85
lines changed

internal/github.com/hyperledger/fabric/sdkpatch/cachebridge/cache.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,6 @@ SPDX-License-Identifier: Apache-2.0
77
Notice: This file has been modified for Hyperledger Fabric SDK Go usage.
88
Please review third_party pinning scripts and patches for more details.
99
*/
10-
/*
11-
Notice: This file has been modified for Hyperledger Fabric SDK Go usage.
12-
Please review third_party pinning scripts and patches for more details.
13-
*/
1410

1511
package cachebridge
1612

scripts/third_party_pins/fabric/apply_fabric_client_utils.sh

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,17 +161,14 @@ gofilter() {
161161
echo "Modifying go source files"
162162
FILTER_FILENAME="bccsp/pkcs11/impl.go"
163163
sed -i'' -e 's/impl{swCSP, conf, keyStore, ctx, sessions, slot, lib, opts.Sensitive, opts.SoftVerify}/impl{BCCSP: swCSP, conf: conf, ks: keyStore, ctx: ctx, sessions: sessions, slot: slot, lib: lib, noPrivImport: opts.Sensitive, softVerify: opts.SoftVerify}/g' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
164-
sed -i'' -e '/"github.com\/hyperledger"/a "sync"/' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
165164
sed -i'' -e '/"math\/big"/a "github.com\/hyperledger\/fabric-sdk-go\/internal\/github.com\/hyperledger\/fabric\/sdkpatch\/cachebridge"' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
166-
sed -i'' -e '/softVerify bool/a rwMtx sync.RWMutex' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
167-
sed -i'' -e '/csp.returnSession(\*session)/a cachebridge.ClearAllSession(csp.rwMtx)' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
165+
sed -i'' -e '/csp.returnSession(\*session)/a cachebridge.ClearAllSession()' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
168166

169167
FILTER_FILENAME="bccsp/pkcs11/pkcs11.go"
170168
sed -i'' -e '/"github.com\/hyperledger"/a "time"/' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
171169
sed -i'' -e '/"math\/big"/a "github.com\/hyperledger\/fabric-sdk-go\/internal\/github.com\/hyperledger\/fabric\/sdkpatch\/cachebridge"' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
172-
sed -i'' -e '/session = s/a cachebridge.ClearSession(csp.rwMtx, fmt.Sprintf("%d", session))' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
170+
sed -i'' -e '/session = s/a cachebridge.ClearSession(fmt.Sprintf("%d", session))' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
173171
sed -i'' -e 's/= findKeyPairFromSKI/= csp.findKeyPairFromSKI/g' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
174-
sed -i'' -e '/return session/i cachebridge.AddSession(csp.rwMtx, fmt.Sprintf("%d", session))' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
175172
sed -i'' -e '/privateKey, err := csp.findKeyPairFromSKI(p11lib,/a defer timeTrack(time.Now(), fmt.Sprintf("signing [session: %d]", session))' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
176173
sed -i'' -e 's/func findKeyPairFromSKI(mod/func (csp \*impl) findKeyPairFromSKI(mod/g' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
177174
START_LINE=`grep -n "func (csp \*impl) findKeyPairFromSKI(mod" "${TMP_PROJECT_PATH}/${FILTER_FILENAME}" | head -n 1 | awk -F':' '{print $1}'`
@@ -180,7 +177,7 @@ for i in {1..27}
180177
do
181178
sed -i'' -e ${START_LINE}'d' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
182179
done
183-
sed -i'' -e '/func (csp \*impl) findKeyPairFromSKI(mod/a return cachebridge.GetKeyPairFromSessionSKI(csp.rwMtx, &cachebridge.KeyPairCacheKey{Mod: mod, Session: session, SKI: ski, KeyType: keyType})' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
180+
sed -i'' -e '/func (csp \*impl) findKeyPairFromSKI(mod/a return cachebridge.GetKeyPairFromSessionSKI(&cachebridge.KeyPairCacheKey{Mod: mod, Session: session, SKI: ski, KeyType: keyType})' "${TMP_PROJECT_PATH}/${FILTER_FILENAME}"
184181
sed -i'' -e '/func (csp \*impl) findKeyPairFromSKI(mod/i \
185182
func timeTrack(start time.Time, msg string) {\
186183
elapsed := time.Since(start)\
Lines changed: 46 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,44 @@
1-
From 9bf4cedf434a3e41e2527c81515bbb33d4cbad83 Mon Sep 17 00:00:00 2001
1+
From e371cf7ebf4d7c5d9168bcd744e15a733294d74f Mon Sep 17 00:00:00 2001
22
From: Sudesh Shetty <sudesh.shetty@securekey.com>
3-
Date: Thu, 12 Jul 2018 16:05:30 -0400
4-
Subject: [PATCH] session cache bridge
3+
Date: Wed, 18 Jul 2018 11:23:55 -0400
4+
Subject: [PATCH] [PATCH] session cache bridge
55

6-
Change-Id: Ibeaaecf690311afc65c1db8dc58236fa3c7e617e
6+
Change-Id: I18d8f7b432b535e6daae2630729e5ddd7688a4e6
77
Signed-off-by: Sudesh Shetty <sudesh.shetty@securekey.com>
88
---
9-
sdkpatch/cachebridge/cache.go | 149 +++++++++++++++++++++
10-
1 file changed, 149 insertions(+)
9+
sdkpatch/cachebridge/cache.go | 121 ++++++++++++++++++++++++++++++++++++++++++
10+
1 file changed, 121 insertions(+)
1111
create mode 100644 sdkpatch/cachebridge/cache.go
1212

1313
diff --git a/sdkpatch/cachebridge/cache.go b/sdkpatch/cachebridge/cache.go
1414
new file mode 100644
15-
index 0000000..4772d51
15+
index 0000000..90d423b
1616
--- /dev/null
1717
+++ b/sdkpatch/cachebridge/cache.go
18-
@@ -0,0 +1,149 @@
18+
@@ -0,0 +1,121 @@
1919
+/*
2020
+Copyright SecureKey Technologies Inc. All Rights Reserved.
2121
+
2222
+SPDX-License-Identifier: Apache-2.0
2323
+*/
24-
+/*
25-
+Notice: This file has been modified for Hyperledger Fabric SDK Go usage.
26-
+Please review third_party pinning scripts and patches for more details.
27-
+*/
2824
+
2925
+package cachebridge
3026
+
3127
+import (
3228
+ "fmt"
3329
+ "time"
3430
+
35-
+ "sync"
36-
+
3731
+ "encoding/hex"
3832
+
3933
+ flogging "github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/sdkpatch/logbridge"
4034
+ "github.com/hyperledger/fabric-sdk-go/pkg/util/concurrent/lazycache"
41-
+ "github.com/hyperledger/fabric-sdk-go/pkg/util/concurrent/lazyref"
4235
+ "github.com/miekg/pkcs11"
4336
+)
4437
+
45-
+var sessionCache map[string]*lazycache.Cache
46-
+
4738
+var logger = flogging.MustGetLogger("bccsp_p11_sessioncache")
4839
+
40+
+var sessionCache = newSessionCache()
41+
+
4942
+const (
5043
+ privateKeyFlag = true
5144
+)
@@ -58,80 +51,59 @@ index 0000000..4772d51
5851
+ KeyType bool
5952
+}
6053
+
61-
+//String return string value for config key
54+
+//String return string value for keyPairCacheKey
6255
+func (keyPairCacheKey *KeyPairCacheKey) String() string {
6356
+ return fmt.Sprintf("%x_%t", keyPairCacheKey.SKI, keyPairCacheKey.KeyType)
6457
+}
6558
+
66-
+func timeTrack(start time.Time, msg string) {
67-
+ elapsed := time.Since(start)
68-
+ logger.Debugf("%s took %s", msg, elapsed)
59+
+// SessionCacheKey
60+
+type SessionCacheKey struct {
61+
+ SessionID string
6962
+}
7063
+
71-
+func ClearAllSession(rwMtx sync.RWMutex) {
72-
+
73-
+ if sessionCache != nil && len(sessionCache) > 0 {
74-
+ rwMtx.Lock()
75-
+ for _, val := range sessionCache {
76-
+ val.Close()
77-
+ }
78-
+ sessionCache = nil
79-
+ rwMtx.Unlock()
80-
+ }
64+
+//String return string value for SessionCacheKey
65+
+func (SessionCacheKey *SessionCacheKey) String() string {
66+
+ return SessionCacheKey.SessionID
8167
+}
8268
+
83-
+func ClearSession(rwMtx sync.RWMutex, key string) {
84-
+ rwMtx.RLock()
85-
+ val, ok := sessionCache[key]
86-
+ rwMtx.RUnlock()
87-
+ if ok {
88-
+ rwMtx.Lock()
89-
+ val.Close()
90-
+ sessionCache[key] = nil
91-
+ rwMtx.Unlock()
69+
+func newSessionCache() *lazycache.Cache {
70+
+ return lazycache.New(
71+
+ "Session_Resolver_Cache",
72+
+ func(key lazycache.Key) (interface{}, error) {
73+
+ return lazycache.New(
74+
+ "KeyPair_Resolver_Cache",
75+
+ func(key lazycache.Key) (interface{}, error) {
76+
+ return getKeyPairFromSKI(key.(*KeyPairCacheKey))
77+
+ }), nil
78+
+ })
79+
+}
9280
+
93-
+ }
81+
+func timeTrack(start time.Time, msg string) {
82+
+ elapsed := time.Since(start)
83+
+ logger.Debugf("%s took %s", msg, elapsed)
9484
+}
9585
+
96-
+func AddSession(rwMtx sync.RWMutex, key string) {
97-
+ rwMtx.RLock()
98-
+ _, ok := sessionCache[key]
99-
+ rwMtx.RUnlock()
86+
+func ClearAllSession() {
87+
+ sessionCache.DeleteAll()
88+
+}
10089
+
101-
+ if !ok {
102-
+ rwMtx.Lock()
103-
+ if sessionCache == nil {
104-
+ sessionCache = make(map[string]*lazycache.Cache)
105-
+ }
106-
+ sessionCache[key] = lazycache.New(
107-
+ "KeyPair_Resolver_Cache",
108-
+ func(key lazycache.Key) (interface{}, error) {
109-
+ return lazyref.New(
110-
+ func() (interface{}, error) {
111-
+ return getKeyPairFromSKI(key.(*KeyPairCacheKey))
112-
+ },
113-
+ ), nil
114-
+ })
115-
+ rwMtx.Unlock()
116-
+ }
90+
+func ClearSession(key string) {
91+
+ sessionCache.Delete(&SessionCacheKey{SessionID: key})
11792
+}
11893
+
119-
+func GetKeyPairFromSessionSKI(rwMtx sync.RWMutex, keyPairCacheKey *KeyPairCacheKey) (*pkcs11.ObjectHandle, error) {
120-
+ rwMtx.RLock()
121-
+ val, ok := sessionCache[fmt.Sprintf("%d", keyPairCacheKey.Session)]
122-
+ rwMtx.RUnlock()
123-
+ if ok {
94+
+func GetKeyPairFromSessionSKI(keyPairCacheKey *KeyPairCacheKey) (*pkcs11.ObjectHandle, error) {
95+
+ keyPairCache, err := sessionCache.Get(&SessionCacheKey{SessionID: fmt.Sprintf("%d", keyPairCacheKey.Session)})
96+
+ if err != nil {
97+
+ return nil, err
98+
+ }
99+
+ if keyPairCache != nil {
100+
+ val := keyPairCache.(*lazycache.Cache)
124101
+ defer timeTrack(time.Now(), fmt.Sprintf("finding key [session: %d] [ski: %x]", keyPairCacheKey.Session, keyPairCacheKey.SKI))
125102
+ value, err := val.Get(keyPairCacheKey)
126103
+ if err != nil {
127104
+ return nil, err
128105
+ }
129-
+ lazyRef := value.(*lazyref.Reference)
130-
+ resolver, err := lazyRef.Get()
131-
+ if err != nil {
132-
+ return nil, err
133-
+ }
134-
+ return resolver.(*pkcs11.ObjectHandle), nil
106+
+ return value.(*pkcs11.ObjectHandle), nil
135107
+ }
136108
+ return nil, fmt.Errorf("cannot find session in sessionCache")
137109
+}
@@ -165,6 +137,5 @@ index 0000000..4772d51
165137
+
166138
+ return &objs[0], nil
167139
+}
168-
--
169-
2.7.4
170-
140+
--
141+
2.7.

0 commit comments

Comments
 (0)