椭圆曲线(Elliptic Curve)
椭圆曲线是满足公式 y 2 = x 3 + a x + b y^2 = x^3 + ax + b y2=x3+ax+b 曲线. 对于任意曲线 S = { ( x , y ) ∣ y 2 = x 3 + a x + b } S = \{(x,y)|y^2 = x^3 + ax + b\} S={(x,y)∣y2=x3+ax+b}, 在其之上, 可以定义运算 + + +.
集合 S S S上的运算,就是一个从 S × S S\times S S×S到 S S S的映射. 换句话说 A ⋅ B = F ( A , B ) = C A\cdot B=F(A,B)=C A⋅B=F(A,B)=C, F F F是满足下列条件的映射: F F F接受两个取自 S S S的参数, 输出一个位于 S S S中的结果 C C C
介绍运算 ⋅ \cdot ⋅的定义前, 我们需要先了解一下椭圆曲线的一些性质.
- 关于 x x x轴对称
- 过曲线上任意两点 A , B A,B A,B的连线必定和曲线交于第三点 C C C,并且这条直线和曲线除了 A , B A,B A,B之外也仅有 C C C这一个交点
- 对于任意 A ( x , y ) A(x,y) A(x,y), 可以定义逆元 A − 1 ( x , − y ) A^{-1}(x,-y) A−1(x,−y), 二者连线垂直于 x x x轴.
基于此, 我们给出运算
⋅
\cdot
⋅ 的定义. 设
A
,
B
A,B
A,B是曲线上任意两点,
C
C
C是
A
,
B
A,B
A,B连线与曲线的交点,
C
′
C'
C′是
C
C
C关于
x
x
x轴的对称点, 运算
⋅
\cdot
⋅定义为:
A
⋅
B
=
C
′
A\cdot B=C'
A⋅B=C′
对于
A
+
A
A+A
A+A这个表达式, 在寻找运算结果时, 不能做连线而要做切线, 运算结果为
A
+
A
=
B
′
A+A = B'
A+A=B′, 可以把
A
+
A
A+A
A+A记作
2
A
2A
2A, 以此类推, 对于任意整数(关于负数可以下面的逆元定义)
a
a
a, 都可以找到曲线上的点
a
A
aA
aA
本文不想深究椭圆曲线的细节, 所以不加证明的给出运算 + + + 的以下性质:
- + + + 满足交换律, 即 A + B = B + A A+B=B+A A+B=B+A
- + + + 满足结合律, 即 ( A + B ) + C = A + ( B + C ) (A+B)+C=A+(B+C) (A+B)+C=A+(B+C)
- 对于任意 A ( x , y ) A(x,y) A(x,y), 可以定义逆元 − A = ( x , − y ) -A=(x,-y) −A=(x,−y), 二者连线垂直于 x x x轴, 可以理解为连线与曲线交于无穷远. 对于这个逆元, B + A + ( − A ) = B B+A +(-A)=B B+A+(−A)=B
- 对于 a G = A aG=A aG=A, 在已知 G G G 和 A A A 的情况下, 几乎无法倒推 a a a 的值
在椭圆曲线上通常把无穷远点 “ p o i n t a t i n f i n i t y " “point\ at\ infinity" “point at infinity" 记作零元 O \mathcal{O} O .
- 易验证, A + ( − A ) = O A +(-A)=\mathcal{O} A+(−A)=O
- 对于一个固定点 A A A, 假设有一个可以在曲线上移动的点 X X X, 当 X X X趋向于无穷远点时, A X AX AX连线与椭圆曲线交点趋向于 − A -A −A, 即 A + O = A A+\mathcal{O}=A A+O=A
- 对于任意整数 k k k, k O = O k\mathcal{O}=\mathcal{O} kO=O
基于椭圆曲线的DH算法
迪菲-赫尔曼密钥交换协议(DH算法), 是一种协商密钥的算法. 在此介绍基于椭圆曲线的DH算法.
Client 和 Server 可以通过一下方式协商密钥.
条件: 需要有双方都预先知道的一条特定椭圆曲线以及曲线上一点 P P P
步骤:
- Client 生成随机数 c c c, 并将 C = c P C=cP C=cP 发送给Server
- Server 生成随机数 s s s, 并将 S = s P S=sP S=sP 发送给 Client
- Server 收到 C C C 后计算 K = s C = s c P K=sC=scP K=sC=scP
- Client 收到 S S S 后计算 K = c S = c s P = s c P K=cS=csP=scP K=cS=csP=scP
- 双方以 K K K 作为密钥
SAE 密钥协商
离散椭圆曲线
为了便于计算, 在密码学中没有使用连续的椭圆曲线, 而是采用了离散椭圆曲线. 离散椭圆曲线由式子
y
2
=
x
3
+
a
x
+
b
m
o
d
p
y^2 = x^3 + ax + b \mod p
y2=x3+ax+bmodp所表示, 它定义了如下一条曲线, 可以看出,
E
E
E 中仅有有限个元素
E
=
{
(
x
,
y
)
∣
y
2
m
o
d
p
=
x
3
+
a
x
+
b
m
o
d
p
,
0
<
x
<
p
,
0
<
y
<
p
}
E = \{(x,y)|y^2\mod p= x^3 + ax + b \mod p, 0<x<p,0<y<p\}
E={(x,y)∣y2modp=x3+ax+bmodp,0<x<p,0<y<p}
在802.11协议中, 进行密钥交换使用的是ECC(Elliptic Curve Cryptography, 椭圆曲线密码学) group. Group(群)的概念在此不做展开, 简单来说, 如果一个集合上可以定义一种满足一系列条件的运算(例如上文提到的
+
+
+), 那么这个集合可以叫做关于这个运算的群. 上文提到曲线
E
E
E 就是关于运算
+
+
+的群.
一个ECC group 由一个六元组 ( p , a , b , G , r , h ) (p, a, b, G, r, h) (p,a,b,G,r,h) 定义
- a , b a,b a,b是椭圆曲线的参数
- p p p 是一个素数
- G G G 是曲线上一个指定的点, 叫做生成元, 在SAE 密钥协商过程中没有使用到
- r r r 是 G G G的素数阶, 即 r r r 是一个素数, 并且 r G = O rG=\mathcal{O} rG=O
- h h h 是余因子, 在SAE 密钥协商过程中没有使用到
当 h = 1 h=1 h=1时(SAE中使用的ECC group都满足这一点), ECC group还有如下性质:
- 对于 E E E中任意点 A A A, 存在整数 k k k 满足条件 A = k G A=kG A=kG
- 对于 E E E中任意点 A A A, r A = r k G = k ( r G ) = O rA=rkG=k(rG)=\mathcal{O} rA=rkG=k(rG)=O
SAE 密钥协商简介
在 STA 向AP 发送的Authentication commit frame中, 需要选择一个ECC group, 选定group就意味着选定了六元组 ( p , a , b , G , r , h ) (p, a, b, G, r, h) (p,a,b,G,r,h)
协议中定义了下面几种函数
- Z = X + Y = elem-op ( X , Y ) \bm{Z} = \bm{X} + \bm{Y} = \text{elem-op}(\bm{X}, \bm{Y}) Z=X+Y=elem-op(X,Y)
- Z = x Y = scalar-op ( x , Y ) \bm{Z} = x\bm{Y} = \text{scalar-op}(x, \bm{Y}) Z=xY=scalar-op(x,Y)
- elem-op ( X , inverse-op ( X ) ) = “ p o i n t a t i n f i n i t y ” \text{elem-op}(\bm{X}, \text{inverse-op}(\bm{X}))=“point\ at\ infinity” elem-op(X,inverse-op(X))=“point at infinity”, 即 inverse-op ( X ) = − X \text{inverse-op}(\bm{X})=-\bm{X} inverse-op(X)=−X
在进行协商时, 双方会根据MAC, password 等信息生成相同的 P W E \bm{PWE} PWE. P W E \bm{PWE} PWE相当于介绍DH算法时提到的点 P P P
STA和AP都需要根据下面公式生成 c o m m i t - s c a l a r commit\text{-}scalar commit-scalar和 COMMIT-ELEMENT \textbf{COMMIT-ELEMENT} COMMIT-ELEMENT发送给对方.
其中 m a s k , r a n d mask, rand mask,rand是随机数, 并且满足条件 1 < r a n d < r a n d , 1 < m a s k < r and ( r a n d + m a s k ) m o d r is greater than 1 1 < rand < r and,\ 1 < mask < r\ \text{and}\ (rand + mask) \mod r\ \text{is greater than 1} 1<rand<rand, 1<mask<r and (rand+mask)modr is greater than 1
c o m m i t - s c a l a r = ( r a n d + m a s k ) m o d r COMMIT-ELEMENT = inverse-op ( scalar-op ( m a s k , P W E ) ) \begin{aligned} &commit\text{-}scalar = (rand + mask)\mod r \\ &\textbf{COMMIT-ELEMENT} = \text{inverse-op}(\text{scalar-op}(mask, \bm{PWE})) \end{aligned} commit-scalar=(rand+mask)modrCOMMIT-ELEMENT=inverse-op(scalar-op(mask,PWE))
对端设备收到后通过如下公式计算
K
\bm{K}
K, 这里的
r
a
n
d
rand
rand和上面公式中的
r
a
n
d
rand
rand不是同一个, 这个是接收方自己生成的
r
a
n
d
rand
rand.
K
\bm{K}
K可以理解为DH算法最终协商的密钥. 在SAE 密钥协商中, 会用它进行进一步处理派生PMK.
K
=
scalar-op
(
r
a
n
d
,
(
elem-op
(
scalar-op
(
p
e
e
r
-
c
o
m
m
i
t
-
s
c
a
l
a
r
,
P
W
E
)
,
P
E
E
R
-
C
O
M
M
I
T
-
E
L
E
M
E
N
T
)
)
)
\begin{aligned} &\bm{K}=\text{scalar-op}(rand,(\text{elem-op}(\text{scalar-op}(peer\text{-}commit\text{-}scalar, \bm{PWE}),\\ &\ \ \ \ \ \ \ \ \ \bm{PEER\text{-}COMMIT\text{-}ELEMENT}))) \end{aligned}
K=scalar-op(rand,(elem-op(scalar-op(peer-commit-scalar,PWE), PEER-COMMIT-ELEMENT)))
对于
K
K
K, 我们将它转变为我们所熟悉的形式. 假设我们现在在AP 端计算
K
K
K, AP 收到了 STA发送的
s
t
a
-
c
o
m
m
i
t
-
s
c
a
l
o
r
=
(
s
t
a
-
r
a
n
d
+
s
t
a
-
m
a
s
k
)
m
o
d
r
sta\text{-}commit\text{-}scalor=(sta\text{-}rand + sta\text{-}mask)\mod r
sta-commit-scalor=(sta-rand+sta-mask)modr, AP也生成了自己
a
p
-
r
a
n
d
ap\text{-}rand
ap-rand, 那么
K
K
K为如下表达式
K
=
a
p
-
r
a
n
d
(
s
t
a
-
s
c
a
l
a
r
P
W
E
+
P
E
E
R
-
C
O
M
M
I
T
-
E
L
E
M
E
N
T
)
=
a
p
-
r
a
n
d
(
s
t
a
-
s
c
a
l
a
r
P
W
E
+
(
−
s
t
a
-
m
a
s
k
P
W
E
)
)
=
a
p
-
r
a
n
d
(
(
s
t
a
-
r
a
n
d
+
s
t
a
-
m
a
s
k
)
m
o
d
r
P
W
E
+
(
−
s
t
a
-
m
a
s
k
P
W
E
)
)
=
a
p
-
r
a
n
d
(
(
s
t
a
-
r
a
n
d
+
s
t
a
-
m
a
s
k
)
m
o
d
r
−
s
t
a
-
m
a
s
k
)
P
W
E
\begin{aligned} K &=ap\text{-}rand(sta\text{-}scalar\bm{PWE}+\bm{PEER\text{-}COMMIT\text{-}ELEMENT})\\ &=ap\text{-}rand(sta\text{-}scalar\bm{PWE} + (-sta\text{-}mask\bm{PWE}))\\ &=ap\text{-}rand((sta\text{-}rand + sta\text{-}mask)\mod r\ \bm{PWE}+(-sta\text{-}mask\bm{PWE}))\\ &=ap\text{-}rand((sta\text{-}rand + sta\text{-}mask)\mod r-sta\text{-}mask)\bm{PWE} \end{aligned}
K=ap-rand(sta-scalarPWE+PEER-COMMIT-ELEMENT)=ap-rand(sta-scalarPWE+(−sta-maskPWE))=ap-rand((sta-rand+sta-mask)modr PWE+(−sta-maskPWE))=ap-rand((sta-rand+sta-mask)modr−sta-mask)PWE
因为
r
P
W
E
=
O
r\bm{PWE}=\mathcal{O}
rPWE=O, 所以可以将
K
K
K进一步化简
K
=
a
p
-
r
a
n
d
(
(
s
t
a
-
r
a
n
d
+
s
t
a
-
m
a
s
k
)
m
o
d
r
−
s
t
a
-
m
a
s
k
)
P
W
E
=
(
a
p
-
r
a
n
d
(
(
s
t
a
-
r
a
n
d
+
s
t
a
-
m
a
s
k
)
m
o
d
r
−
s
t
a
-
m
a
s
k
)
)
m
o
d
r
P
W
E
=
(
a
p
-
r
a
n
d
(
(
s
t
a
-
r
a
n
d
+
s
t
a
-
m
a
s
k
)
−
s
t
a
-
m
a
s
k
)
)
m
o
d
r
P
W
E
=
(
a
p
-
r
a
n
d
×
s
t
a
-
r
a
n
d
)
m
o
d
r
P
W
E
\begin{aligned} K &=ap\text{-}rand((sta\text{-}rand + sta\text{-}mask)\mod r-sta\text{-}mask)\bm{PWE}\\ &=(ap\text{-}rand((sta\text{-}rand + sta\text{-}mask)\mod r-sta\text{-}mask))\mod r\ \bm{PWE}\\ &=(ap\text{-}rand((sta\text{-}rand + sta\text{-}mask)\ -sta\text{-}mask))\mod r\ \bm{PWE}\\ &=(ap\text{-}rand\times sta\text{-}rand)\mod r\ \bm{PWE}\\ \end{aligned}
K=ap-rand((sta-rand+sta-mask)modr−sta-mask)PWE=(ap-rand((sta-rand+sta-mask)modr−sta-mask))modr PWE=(ap-rand((sta-rand+sta-mask) −sta-mask))modr PWE=(ap-rand×sta-rand)modr PWE
同理可知, STA收到 a p - c o m m i t - s c a l o r = ( a p - r a n d + a p - m a s k ) m o d r ap\text{-}commit\text{-}scalor=(ap\text{-}rand + ap\text{-}mask)\mod r ap-commit-scalor=(ap-rand+ap-mask)modr后也能计算出相同的 K \bm{K} K. 如此, 便完成了DH密钥交换.
P W E PWE PWE 的生成方式
802.11中规定了两种PWE的生成方式
通过循环生成 P W E PWE PWE (hunting and pecking模式)
这种模式的原理是在循环中根据password和MAC生成Hash值, pwd-value, 直至这个Hash可以作为一个ECC group中的 x x x坐标, 即 存在 ( x , y ) ∈ E , 满足 x = p w d - v a l u e 存在(x,y)\in E, 满足x=pwd\text{-}value 存在(x,y)∈E,满足x=pwd-value
我们注意一下这个算法需要以下输入, 在AP 和STA 输入是相同的, 所以计算得出的 P W E PWE PWE也是相同的
- STA-A-MAC \text{STA-A-MAC} STA-A-MAC: 参与认证的一方的MAC地址, 因为SAE是对等的, 所以参与认证的双方用 STA-A \text{STA-A} STA-A和 STA-B \text{STA-B} STA-B表示
- STA-B-MAC \text{STA-B-MAC} STA-B-MAC: 参与认证的另一方的MAC地址
- p a s s w o r d password password: SSID 配置的密码
- H \text{H} H 是一个Hash函数
- 算法中有个 k k k 表示最小循环次数, 该值一般为40. 如果只进行了 m ( n < k ) m(n<k) m(n<k)次循环就找到了符合条件的 p w d - v a l u e pwd\text{-}value pwd-value, 那么还是会进行循环直到循环够40次, 但后续的循环中不会再对 p w d - v a l u e , s a v e , b a s e pwd\text{-}value, save,base pwd-value,save,base做任何修改. k k k通过函数dragonfly_min_pwe_loop_iter选取.
unsigned int dragonfly_min_pwe_loop_iter(int group) { if (group == 22 || group == 23 || group == 24) { /* FFC groups for which pwd-value is likely to be >= p * frequently */ return 40; } if (group == 1 || group == 2 || group == 5 || group == 14 || group == 15 || group == 16 || group == 17 || group == 18) { /* FFC groups that have prime that is close to a power of two */ return 1; } /* Default to 40 (this covers most ECC groups) */ return 40; }
Hash-to-curve生成方式(Hash to element, H2E)
hunting and pecking模式有一个缺陷(CVE-2019-9494), 对不同的 p a s s w o r d password password 生成 p w d - v a l u e pwd\text{-}value pwd-value 的时间是不同的, 攻击者可通过测量生成 P W E \bm{PWE} PWE所需的时间, 推断出密码验证所需的计算轮次, 进而推测密码的可能值(side-channel timing attack)。
为了应对这一风险, 802.11推出了H2E 生成方式.
H2E 的原理概括如下, 从这个原理可知, 双方生成 P W E \bm{PWE} PWE所用的材料都是一致的, 所以生成的 P W E \bm{PWE} PWE也是相同的
- SSID 和 password 生成两个Hash值
- 通过 SSWU \text{SSWU} SSWU函数将这两个Hash值直接映射到ECC group上的两点 P 1 , P 2 \bm{P1},\bm{P2} P1,P2
- 将二者相加得到 P T \bm{PT} PT
- 在Authentication时, 根据 P T , STA-A-MAC , STA-B-MAC \bm{PT},\text{STA-A-MAC}, \text{STA-B-MAC} PT,STA-A-MAC,STA-B-MAC计算 P W E \bm{PWE} PWE
- H , HKDF-Expand , HKDF-Extract \text{H}, \text{HKDF-Expand}, \text{HKDF-Extract} H,HKDF-Expand,HKDF-Extract 根据输入的参数生成Hash值
- SSWU \text{SSWU} SSWU可以输入的整数映射到ECC group上, 并且无论输入的参数如何, 计算所用的时间是相同的
- 注意到 P T \bm{PT} PT的生成只需要知道SSID 和 password, 所以可以在很早的阶段(例如AP配置阶段, STA网络选择阶段)计算 P T \bm{PT} PT, 在Authentication时只需要通过少量计算便可生成 P W E \bm{PWE} PWE
考察整个 P W E \bm{PWE} PWE的生成过程, 无论是计算 P T \bm{PT} PT 还是计算 P W E \bm{PWE} PWE, 计算所需时间都是一个和输入参数无关的常数, 这就很好的避免了side-channel timing attack.
SSWU \text{SSWU} SSWU定义如下
在Authentication 时根据如下公式计算 P W E \bm{PWE} PWE
选择 P W E PWE PWE 生成方式
支持H2E 的AP应该在Beacon和Probe Response的 RSNXE中的Extended RSN Capabilities field中将 hash-to-element 设为 1.
如果STA 支持H2E并且要在连接中使用H2E, 那么在Authentication commit中应将status code设置为SAE_HASH_TO_ELEMENT
SAE Authentication 步骤
SAE Authentication的步骤如下所示, FFE就是上文提到的
COMMIT-ELEMENT
\textbf{COMMIT-ELEMENT}
COMMIT-ELEMENT
STA 和AP 会先互相发送一组 commit 帧, 然后在互相发送一组 confirm 帧.
STA Commit 帧的生成
按照上文提到方法生成 c o m m i t - s c a l a r commit\text{-}scalar commit-scalar和 COMMIT-ELEMENT \textbf{COMMIT-ELEMENT} COMMIT-ELEMENT发送给AP.
AP 处理 Commit 帧
AP 会检查 Commit帧中的scalar和FFE, 如果验证失败则发送一个Commit 帧并将status code设置为SECCESS和SAE_HASH_TO_ELEMENT以外的值表示认证失败. 如果认证成功则正常发送自己生成的scalar和FFE.
在这一步无法验证STA 的 P W E \bm{PWE} PWE是否正确, 即无法验证STA输入的password是否正确. 此时, 只是验证scalar和FFE是否符合协议的要求.
- scalar应该大于1小于 r r r(ECC group 定义中的 r r r)
- FFE中的 x , y x,y x,y应该满足 0 ≤ x , y < p 且 ( x , y ) 位于ECC group中 0\le x,y<p 且 (x,y)位于\text{ECC group} 中 0≤x,y<p且(x,y)位于ECC group中
当AP生成了自己的 r a n d , m a s k rand, mask rand,mask之后, 它便集齐了计算 K \bm{K} K(DH密钥协商的结果)所需的所有材料. AP会按照上文所提到的公式计算 K \bm{K} K, 然后再进一步通过下面的公式派生 PMK, KCK \text{PMK, KCK} PMK, KCK
- H \text{H} H是一个Hash函数, 或者说基于Hash实现的消息验证码生成函数
- k k k 是 K \bm{K} K 的 x x x 坐标
- L ( k c k _ a n d _ p m k , Q , 256 ) \text{L}(kck\_and\_pmk, Q, 256) L(kck_and_pmk,Q,256)表示截取 k c k _ a n d _ p m k kck\_and\_pmk kck_and_pmk的 Q Q Q到255位
- s a l t salt salt一般是全0的字节序列, 它的长度取决于 H \text{H} H
同时 AP 还会生成一个counter,
s
e
n
d
-
c
o
n
f
i
r
m
send\text{-}confirm
send-confirm, 然后计算一个
c
o
n
f
i
r
m
confirm
confirm
CN \text{CN} CN是一个Hash函数, 或者说是一个消息验证码生成函数
AP生成 Commit 帧
按照上文提到方法生成 c o m m i t - s c a l a r commit\text{-}scalar commit-scalar和 COMMIT-ELEMENT \textbf{COMMIT-ELEMENT} COMMIT-ELEMENT发送给STA.
STA 处理AP 发送的 Commit帧
与AP端类似, STA要验证AP 的 scalar和FFE的合法性然后计算 PMK, KCK \text{PMK, KCK} PMK, KCK
STA 也会根据同样的公式计算
c
o
n
f
i
r
m
confirm
confirm. 需要注意的是与AP生成的
c
o
n
f
i
r
m
confirm
confirm相比,1.
CN
\text{CN}
CN参数中的
c
o
m
m
i
t
-
s
c
a
l
a
r
,
C
O
M
M
I
T
-
E
L
E
M
E
N
T
commit\text{-}scalar, \bm{COMMIT\text{-}ELEMENT}
commit-scalar,COMMIT-ELEMENT与
p
e
e
r
-
c
o
m
m
i
t
-
s
c
a
l
a
r
,
p
e
e
r
-
C
O
M
M
I
T
-
E
L
E
M
E
N
T
peer\text{-}commit\text{-}scalar, \bm{peer\text{-}COMMIT\text{-}ELEMENT}
peer-commit-scalar,peer-COMMIT-ELEMENT 位置实际上是对调的, 所以 AP 的
c
o
n
f
i
r
m
confirm
confirm 与 STA 的
c
o
n
f
i
r
m
confirm
confirm 是不同的.
STA 发送confirm 帧
生成 c o n f i r m confirm confirm后, STA将它填入 Authentication confirm帧中发送给AP
AP 处理 STA 发送的confirm帧
AP 收到 confirm 帧后会根据下面公式计算一个
v
e
r
i
f
i
e
r
verifier
verifier. 如果STA 输入的password是正确的, 那么STA所计算的
K
C
K
KCK
KCK应该与AP一致, 那么此时AP 计算的
v
e
r
i
f
i
e
r
verifier
verifier应该等于STA confirm帧中的
c
o
n
f
i
r
m
confirm
confirm
如果
v
e
r
i
f
i
e
r
verifier
verifier 不等于 STA confirm帧中的
c
o
n
f
i
r
m
confirm
confirm, 那么认证失败. AP 会向STA 发送 confirm 帧, 其中 statu code应该设置为CHALLENGE_FAILURE(15), 不过一些AP此时会将statu code设置为REFUSED_REASON_UNSPECIFIED(1). 不过无所谓, 只要confirm 帧中的statu code 不是SUCCESS 都代表认证失败.
如果 v e r i f i e r verifier verifier 不等于 STA confirm帧中的 c o n f i r m confirm confirm, 那么认证成功, AP 向STA发送confirm 帧, 其中包含AP生成的 c o n f i r m , s e n d - c o n f i r m confirm, send\text{-}confirm confirm,send-confirm 以及 status code SECCESS.
STA 处理 AP 发送的 confirm 帧
STA 同样会计算 v e r i f i e r verifier verifier来校验AP 发送的confirm 帧. 如果校验失败, 一般是发起deauthentication.
至此,便完成了一次 SAE authentication.