diff --git a/internal/entities/user_interface.go b/internal/entities/user_interface.go index ea34a86..78f7377 100644 --- a/internal/entities/user_interface.go +++ b/internal/entities/user_interface.go @@ -141,39 +141,30 @@ func (u *UserInterface) AttributeAdjacencyGraph() (map[int]utils.Set[int], error } func (u *UserInterface) LoginShuffle() error { - err := u.shuffleKeys() - if err != nil { + if err := u.shuffleKeys(); err != nil { return err } - numbOfSelectedSets := u.Kp.AttrsPerKey / 2 - if u.Kp.AttrsPerKey&1 == 1 { - numbOfSelectedSets += security.Choice[int]([]int{0, 1}) + keypadSet1, err := u.InterfaceMatrix() + if err = u.shuffleKeys(); err != nil { + return err } + keypadSet2, err := u.InterfaceMatrix() + numbOfSelectedSets := u.Kp.AttrsPerKey / 2 setIdxs, err := security.RandomPermutation(u.Kp.AttrsPerKey) if err != nil { return err } selectedSets := utils.NewSetFromSlice[int](setIdxs[:numbOfSelectedSets]) - keypadSetView, err := u.SetViewMatrix() - if err != nil { - return err - } - interfaceBySet := make([][]int, u.Kp.AttrsPerKey) - for idx, attrs := range keypadSetView { - if selectedSets.Contains(idx) { - err = security.FisherYatesShuffle[int](&attrs) - if err != nil { - return err + for keyIdx, key := range keypadSet1 { + for idx, attrIdx := range key { + if selectedSets.Contains(attrIdx) { + keypadSet1[keyIdx][idx] = keypadSet2[keyIdx][idx] } } - interfaceBySet[idx] = attrs } - keypadView, err := security.MatrixTranspose(interfaceBySet) - if err != nil { - return err - } - u.IdxInterface = security.MatrixToList(keypadView) + + u.IdxInterface = security.MatrixToList(keypadSet1) return nil }