1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
package webauthn
import (
"reflect"
"testing"
p "github.com/go-webauthn/webauthn/protocol"
)
func TestAuthenticator_UpdateCounter(t *testing.T) {
type fields struct {
AAGUID []byte
SignCount uint32
CloneWarning bool
}
type args struct {
authDataCount uint32
}
tests := []struct {
name string
fields fields
args args
wantWarning bool
}{
{
"Increased counter",
fields{
AAGUID: make([]byte, 16),
SignCount: 1,
CloneWarning: false,
},
args{
authDataCount: 2,
},
false,
},
{
"Unchanged counter",
fields{
AAGUID: make([]byte, 16),
SignCount: 1,
CloneWarning: false,
},
args{
authDataCount: 1,
},
true,
},
{
"Decreased counter",
fields{
AAGUID: make([]byte, 16),
SignCount: 2,
CloneWarning: false,
},
args{
authDataCount: 1,
},
true,
},
{
"Zero counter",
fields{
AAGUID: make([]byte, 16),
SignCount: 0,
CloneWarning: false,
},
args{
authDataCount: 0,
},
false,
},
{
"Counter returned to zero",
fields{
AAGUID: make([]byte, 16),
SignCount: 1,
CloneWarning: false,
},
args{
authDataCount: 0,
},
true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
a := &Authenticator{
AAGUID: tt.fields.AAGUID,
SignCount: tt.fields.SignCount,
CloneWarning: tt.fields.CloneWarning,
}
previousSignCount := a.SignCount
a.UpdateCounter(tt.args.authDataCount)
if a.CloneWarning != tt.wantWarning {
t.Errorf("Clone warning result [%v] does not match expectation: [%v]", a.CloneWarning, tt.wantWarning)
return
}
// If there's no clone warning then, assert that the SignCount is updated.
if !a.CloneWarning && a.SignCount != tt.args.authDataCount {
t.Errorf("Sign Count value [%v] does not match expectation [%v]", a.SignCount, tt.args.authDataCount)
return
}
// If there's clone warning then, assert that the Sign Count remains unchanged.
if a.CloneWarning && a.SignCount != previousSignCount {
t.Errorf("Sign Count value [%v] does not match expectation [%v]", a.SignCount, tt.args.authDataCount)
return
}
})
}
}
func TestSelectAuthenticator(t *testing.T) {
type args struct {
att string
rrk *bool
uv string
}
tests := []struct {
name string
args args
want p.AuthenticatorSelection
}{
{"Generate Correct Authenticator Selection",
args{
att: "platform",
rrk: p.ResidentKeyNotRequired(),
uv: "preferred",
},
p.AuthenticatorSelection{
AuthenticatorAttachment: p.Platform,
RequireResidentKey: p.ResidentKeyNotRequired(),
UserVerification: p.VerificationPreferred,
},
},
{"Generate Correct Authenticator Selection",
args{
att: "cross-platform",
rrk: p.ResidentKeyRequired(),
uv: "required",
},
p.AuthenticatorSelection{
AuthenticatorAttachment: p.CrossPlatform,
RequireResidentKey: p.ResidentKeyRequired(),
UserVerification: p.VerificationRequired,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := SelectAuthenticator(tt.args.att, tt.args.rrk, tt.args.uv); !reflect.DeepEqual(got, tt.want) {
t.Errorf("SelectAuthenticator() = %v, want %v", got, tt.want)
}
})
}
}
|