近期中移需要EAP-SIM/AKA, EAP-MSCHAPv2, EAP-PEAP等,编写产品需求中,多看点协议。
学习EAP-MSCHAPv2协议,下面是自己的理解及部分段落的翻译,
看的是,
Microsoft EAP CHAP Extensions draft-kamath-pppext-eap-mschapv2-02.txt 2007
也不知是不是最新的
EAP-MSCHAPv2 是在EAP协议框架内封装了mschapv2协议,支持双向认真及密钥生成。密钥生成使用MPPE,参见RFC3079(Deriving Keys for use with Microsoft Point-to-Point Encryption (MPPE))。器双向认证则通过peer的response报文中捎带一个challenge,server则在一个success报文中对此响应。
EAP-MSCHAPv2报文格式如下
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code | Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | OpCode | MS-CHAPv2-ID | MS-Length...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| MS-Length | Data...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Code,Identifier,Length,Type四字段共5个字节同一般的EAP报文含义,其中EAP MS-CHAP-V2的Type值为26
OpCode字段占一个字节,表示eapmschapv2消息类型,含义为
1 Challenge
2 Response
3 Success
4 Failure
7 Change-Password
MS-CHAPv2-ID字段占一个字节,用于匹配mschapv2的请求与响应,一般该字段与Identifier字段值相同。
MS-Length字段占两个字节,必须设置为Length字段减去5.
Data该部分根据OpCode相应设置。
Challenge报文
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code | Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | OpCode | MS-CHAPv2-ID | MS-Length...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| MS-Length | Value-Size | Challenge...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Challenge...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Name...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Value-Size 一个字节,随后challenge字段的长度,eapmschapv2采用16字节的challenge,因而此字段设置为0x10
Challenge 16个字节的挑战字,没什么可说的
Name 发送此报文的系统id,长度等于
Length - length of (eapheader type opcode mschapid mslength, valuesize,challenge )=Length - 10 - ChallengeSize = Length - 10 - ValueSize
Response报文
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code | Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | OpCode | MS-CHAPv2-ID | MS-Length...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| MS-Length | Value-Size | Response...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Response...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Name...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
只说下Response。
Response长度为49字节,依次为
16 octets: Peer-Challenge 终端产生的16字节随机数
8 octets: Reserved, must be zero
24 octets: NT-Response 用server发来的challenge和MS自己的PeerChallenge利用GenerateNTResponse生成NT-Response
1 octet : Flags 保留,必须为0
Name为0-256长度的大小写敏感的字符,当然一般不会到256长度的。
server用同样的函数计算NT-Response如果匹配,则发送SuccessRequest(OpType=3),否则发送FailureRequest(OpType=4)。
SuccessRequest报文
报文格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code | Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | OpCode | MS-CHAPv2-ID | MS-Length...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| MS-Length | Message...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Message包括42字节的鉴权服务器响应以及一个可见字符串消息
"S=<auth_string> M=<message>"
其中auth_string是20个oct编码成德ascii字符,A-F必须用大写。
此值根据challenge, peerchallenge,NT-Response以及MS的密码经由GenerateAuthenticatorResponse计算得到,如果peer收到server的SuccessRequestPacket必须校验此值,如果此段缺失或错误则peer直接结束此次会话,不用任何响应。
message为可读有意义字符串。
我的一次实验得到的数据位
0000 01 02 00 38 1a 03 01 00 33 53 3d 31 45 31 39 32 ...8.... 3S=1E192
0010 36 32 33 36 41 37 39 37 38 39 39 43 45 42 34 42 6236A797 899CEB4B
0020 45 30 43 36 37 37 39 32 46 39 41 38 39 32 31 36 E0C67792 F9A89216
0030 35 36 39 20 4d 3d 4f 4b 569 M=OK
SuccessResponse报文
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code | Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | OpCode |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
OpCode=3 Success
无他
FailureRequest
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code | Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | OpCode | MS-CHAPv2-ID | MS-Length...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| MS-Length | Message...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Message格式如下
"E=eeeeeeeeee R=r C=cccccccccccccccccccccccccccccccc V=vvvvvvvvvv M=<msg>"
其中"eeeeeeeeee"是10进制错误码的ascii表示。错误码如下
646 ERROR_RESTRICTED_LOGON_HOURS
647 ERROR_ACCT_DISABLED
648 ERROR_PASSWD_EXPIRED
649 ERROR_NO_DIALIN_PERMISSION
691 ERROR_AUTHENTICATION_FAILURE
709 ERROR_CHANGING_PASSWORD
r单个字符,1表示可以重试,0则不可。上述646 647 649一般为不可重试。
cccccccccccccccccccccccccccccccc 是16进制challenge的ascii表示,必须为32字符,且必须存在。
"vvvvvvvvvv" 指示服务器支持的passwordchanging协议的版本号,对mschapv2 此值为3
msg为可读有意义字符串。
Failure Response报文
如果FailureRequest中R=1,则peer可以重试鉴权过程,如重发Response报文或ChangePwd报文。
如果为R=0则OpCode=4的FailureResponse报文。
格式如下
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code | Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | OpCode |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
OpCode=4
ChangePassword报文
该报文仅可在鉴权者的FailureRequest报文中指示错误原因为ERROR_PASSWD_EXPIRED (E=648)时发送。
报文格式为
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code | Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | OpCode | MS-CHAPv2-ID | MS-Length...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| MS-Length | Data...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Data长度为582字节,
516 octets : Encrypted-Password
16 octets : Encrypted-Hash
16 octets : Peer-Challenge
8 octets : Reserved
24 octets : NT-Response
2-octet : Flags