in client/shares/shares.go [139:177]
func CreateDEKShares(dek DEK, keyCfg *configpb.KeyConfig) ([][]byte, error) {
var shares [][]byte
// Depending on the key splitting algorithm given in the KeyConfig, take
// the DEK and split it, wrapping the resulting shares and writing them
// back to the `Shares` field of `metadata`.
switch keyCfg.KeySplittingAlgorithm.(type) {
// Don't split the DEK.
case *configpb.KeyConfig_NoSplit:
if len(keyCfg.GetKekInfos()) != 1 {
return nil, fmt.Errorf("invalid Encrypt configuration, number of KekInfos is %v but expected 1 for 'no split' option", len(keyCfg.GetKekInfos()))
}
shares = [][]byte{dek[:]}
// Split DEK with Shamir's Secret Sharing.
case *configpb.KeyConfig_Shamir:
shamirConfig := keyCfg.GetShamir()
shamirShares := int(shamirConfig.GetShares())
shamirThreshold := int(shamirConfig.GetThreshold())
// The number of KEK Infos should match the number of shares to generate
if len(keyCfg.GetKekInfos()) != shamirShares {
return nil, fmt.Errorf("invalid Encrypt configuration, number of KEK Infos does not match the number of shares to generate: found %v KEK Infos, %v shares", len(keyCfg.GetKekInfos()), shamirShares)
}
var err error
shares, err = SplitShares(dek[:], shamirShares, shamirThreshold)
if err != nil {
return nil, fmt.Errorf("error splitting encryption key: %v", err)
}
default:
return nil, fmt.Errorf("unknown key splitting algorithm")
}
return shares, nil
}