前面說過要找時間介紹一下bccsp包下面的工廠factory,so here it is.
通過factory目前可以獲得兩類BCCSP實例,一個是上文說的sw,還有一個是通過pkcs11實現的。
BCCSP實例是通過工廠來提供的,sw包對應的工廠在swFactory.go中實現,pkcs11包對應的工廠在pkcs11Factory.go中實現,它們都共同實現了下面的BCCSPFactory接口:
// BCCSPFactory is used to get instances of the BCCSP interface. 11 // A Factory has name used to address it. 12 type BCCSPFactory interface { 13 14 // Name returns the name of this factory 15 Name() string //用來返回bccsp接口實例名 16 17 // Get returns an instance of BCCSP using opts. 18 Get(opts *FactoryOpts) (bccsp.BCCSP, error) //根據opts配置返回具體的bccsp實例 19 }
需要注意的是,在factory.go源碼中,用全局變量bccspMap(一個BCCSP的數組)來保存這些實例化的bccsp,同時用一個全局變量bootBCCSP來保存缺省的BCCSP接口實例. 這兩個全局變量的初始化工作是通過調用InitFactories來實現的。
// InitFactories must be called before using factory interfaces 8 // It is acceptable to call with config = nil, in which case 7 // some defaults will get used 6 // Error is returned only if defaultBCCSP cannot be found 5 func InitFactories(config *FactoryOpts) error { 4 factoriesInitOnce.Do(func() { 3 setFactories(config) 2 }) 1 return factoriesInitError 1 }
1、在使用BCCSP之前都需要調用上面的函數來對bootBCCSP和bccspMap來賦值,之后就可以使用GetDefault()來獲取缺省bootBCCSP(默認是sw)或者通過GetBCCSP(name string)來獲取bccspMap中其他的BCCSP實例(sw或者pkcs11). 其實bccsp/factory包下面還提供了其他的方法來獲取BCCSP實例,如也可以直接通過GetBCCSPFromOpts根據opts的設置來直接得到具體的BCCSP實例,這部分可以直接去看代碼實現。
2、接下來就可以通過獲取的BCCSP實例(如sw或者pkcs11實現)進行加解密,簽名驗證,哈希,密鑰導入和派生以及密鑰生成操作
------------------------------------------
先把流程弄清楚然后擼代碼,這樣會爽一點。