code: func (k *KdfParameters) readKdfParameters(data []byte) error {
  	dict := new(VariantDictionary)
  	if err := dict.readVariantDictionary(data); err != nil {
  		return err
  	}
  
  	k.RawData = dict
  	for _, item := range dict.Items {
  		switch string(item.Name) {
  		case "$UUID":
  			k.UUID = item.Value
  		case "R":
  			k.Rounds = binary.LittleEndian.Uint64(item.Value)
  		case "S":
  			copy(k.Salt[:], item.Value[:32])
  		case "P":
  			k.Parallelism = binary.LittleEndian.Uint32(item.Value)
  		case "M":
  			k.Memory = binary.LittleEndian.Uint64(item.Value)
  		case "I":
  			k.Iterations = binary.LittleEndian.Uint64(item.Value)
  		case "V":
  			k.Version = binary.LittleEndian.Uint32(item.Value)
  		case "K":
  			k.SecretKey = item.Value
  		case "A":
  			k.AssocData = item.Value
  		default:
  			return ErrUnknownParameterID(string(item.Name))
  		}
  	}
  	return nil
  }
docs: // readKdfParameters reads a variant dictionary and puts values into KdfParameters