refactor user defined keypad
This commit is contained in:
@@ -7,68 +7,79 @@ import (
|
||||
"go-nkode/util"
|
||||
)
|
||||
|
||||
// TODO: make generic
|
||||
var NotDispersableError = errors.New("number of keys must be less than the number of attributes per key to be dispersion resistant")
|
||||
|
||||
type CustomerAttributes struct {
|
||||
AttrVals []uint64
|
||||
SetVals []uint64
|
||||
KeypadSize m.KeypadSize
|
||||
attrVals []uint64
|
||||
setVals []uint64
|
||||
}
|
||||
|
||||
func NewCustomerAttributes(keypadSize m.KeypadSize) (*CustomerAttributes, error) {
|
||||
if keypadSize.IsDispersable() {
|
||||
return nil, errors.New("number of keys must be less than the number of attributes per key to be dispersion resistant")
|
||||
}
|
||||
|
||||
attrVals, errAttr := util.GenerateRandomNonRepeatingUint64(keypadSize.TotalAttrs())
|
||||
func NewCustomerAttributes() (*CustomerAttributes, error) {
|
||||
attrVals, errAttr := util.GenerateRandomNonRepeatingUint64(m.KeypadMax.TotalAttrs())
|
||||
if errAttr != nil {
|
||||
return nil, errAttr
|
||||
}
|
||||
setVals, errSet := util.GenerateRandomNonRepeatingUint64(keypadSize.AttrsPerKey)
|
||||
setVals, errSet := util.GenerateRandomNonRepeatingUint64(m.KeypadMax.AttrsPerKey)
|
||||
if errSet != nil {
|
||||
return nil, errSet
|
||||
}
|
||||
|
||||
customerAttrs := CustomerAttributes{
|
||||
AttrVals: attrVals,
|
||||
SetVals: setVals,
|
||||
KeypadSize: keypadSize,
|
||||
attrVals: attrVals,
|
||||
setVals: setVals,
|
||||
}
|
||||
return &customerAttrs, nil
|
||||
}
|
||||
|
||||
func (c *CustomerAttributes) Renew() error {
|
||||
attrVals, errAttr := util.GenerateRandomNonRepeatingUint64(c.KeypadSize.TotalAttrs())
|
||||
attrVals, errAttr := util.GenerateRandomNonRepeatingUint64(m.KeypadMax.TotalAttrs())
|
||||
if errAttr != nil {
|
||||
return errAttr
|
||||
}
|
||||
setVals, errSet := util.GenerateRandomNonRepeatingUint64(c.KeypadSize.AttrsPerKey)
|
||||
setVals, errSet := util.GenerateRandomNonRepeatingUint64(m.KeypadMax.AttrsPerKey)
|
||||
if errSet != nil {
|
||||
return errSet
|
||||
}
|
||||
c.AttrVals = attrVals
|
||||
c.SetVals = setVals
|
||||
c.attrVals = attrVals
|
||||
c.setVals = setVals
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *CustomerAttributes) IndexOfAttr(attrVal uint64) int {
|
||||
// TODO: should this be mapped instead?
|
||||
return util.IndexOf[uint64](c.AttrVals, attrVal)
|
||||
return util.IndexOf[uint64](c.attrVals, attrVal)
|
||||
}
|
||||
|
||||
func (c *CustomerAttributes) IndexOfSet(setVal uint64) (int, error) {
|
||||
// TODO: should this be mapped instead?
|
||||
idx := util.IndexOf[uint64](c.SetVals, setVal)
|
||||
idx := util.IndexOf[uint64](c.setVals, setVal)
|
||||
if idx == -1 {
|
||||
return -1, errors.New(fmt.Sprintf("Set Val %d is invalid", setVal))
|
||||
}
|
||||
return idx, nil
|
||||
}
|
||||
|
||||
func (c *CustomerAttributes) GetAttrSetVal(attrVal uint64) (uint64, error) {
|
||||
func (c *CustomerAttributes) GetAttrSetVal(attrVal uint64, userKeypad m.KeypadDimension) (uint64, error) {
|
||||
indexOfAttr := c.IndexOfAttr(attrVal)
|
||||
if indexOfAttr == -1 {
|
||||
return 0, errors.New(fmt.Sprintf("No attribute %d", attrVal))
|
||||
}
|
||||
setIdx := indexOfAttr % c.KeypadSize.AttrsPerKey
|
||||
return c.SetVals[setIdx], nil
|
||||
setIdx := indexOfAttr % userKeypad.AttrsPerKey
|
||||
return c.setVals[setIdx], nil
|
||||
}
|
||||
|
||||
func (c *CustomerAttributes) AttrVals(userKp m.KeypadDimension) ([]uint64, error) {
|
||||
err := userKp.IsValidKeypadDimension()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return c.attrVals[:userKp.TotalAttrs()], nil
|
||||
}
|
||||
|
||||
func (c *CustomerAttributes) SetVals(userKp m.KeypadDimension) ([]uint64, error) {
|
||||
err := userKp.IsValidKeypadDimension()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return c.setVals[:userKp.AttrsPerKey], nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user