CHAP包封装在PPP数据联络层帧的信息域中,它的协议域是c223 。下面是CHAP包格
式的总结 。各个域由左到右传输 。
0123
01234567890123456789012345678901
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CodeIdentifierLength
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Data...
- - - -
代码
代码域是一个字节,代表CHAP包的类型 。CHAP代码分配如下:
1 Challenge
2 esponse
3 SUCcess
4 Failure
标识符
标识符是一个字节,用于匹配challenge,response和replies 。
长度
长度域是两个字节,代表CHAP包的长度,包括Code,Identifier,Length和Data 。超出这
个长度的字节应该被认为是链路层的填料,在接收端应该被忽略 。
数据
数据域是零个或者多个字节 。它的格式由code域决定 。
3.2.1Challenge和Response
描述
Challenge包用来启动CHAP 。验证者必须发送一个代码域是1的CHAP包 。一直到接收
到有效的响应包或者重试计数器超时,必须不停发送Challenge包 。
在网络层协议阶段的任一个时间也可以发送Challenge包确保连接没有改变 。
在验证阶段和网络层协议阶段对端应该期待Challenge包 。无论何时接到Challenge包,
对端必须发送一个代码域是2的CHAP包 。
无论何时验证者接到一个Response包,则它比较Response值和自己计算的期待值是否
相同 。在比较的基础上,验证者必须发送一个Success或者Failure包 。
实现注重:因为Success包有可能丢失,验证者必须在完成验证阶段后答应重复的
Response包 。为了防止名字和秘密的泄漏,在验证阶段后,任何具有当前Challenge标识符的
Response包必须返回相同的响应代码 。在其他阶段接到的任何Response包必须被静静地丢掉 。
假如Failure包丢失和验证者终止链路,则LCP的Terminate-Request包和Terminate-Ack
包提供了另一种代表验证失败的方法 。
下面是Challenge和Response包格式的总结 。各个域由左到右传输 。
0123
01234567890123456789012345678901
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CodeIdentifierLength
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Value-SizeValue...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name...
- - - - - - - - - - - - - - - -
代码
1 Challenge
2 Response
标识符
标识符是一个字节,每发送一个Challenge包标识符必须改变 。Response包的标识符必
须从引起这个响应的Challenge包的标识符复制过来的 。
Value-Size
此域是一个字节,代表Value域的长度 。
Value
Value域是一个或多个字节 。最重要的字节先传输 。
ChallengeValue是一个可变的字节流 。上面讲述了ChallengeValue唯一性的重要性以及
它和秘密的关系 。每次发送Challenge包必须改变ChallengeValue 。ChallengeValue的长度依
靠于产生字节所使用的方法,独立于所用的哈希算法 。
ResponseValue是在字节流上用单向哈希算法计算得出的,字节流包含Identifier,后面是
secret,再后面是ChallengeValue 。ResponseValue的长度依靠于所用的哈希算法(对于MD5
是16个字节) 。
名字
名字域是一个或多个字节,代表发送包的系统的标识 。对这个域的内容没有限制 。例如,
它可以是ASCII字符串或者是ASN.1语法中的全局唯一标识 。名字不应该是以NULL或者
CR/LF结尾的 。大小由长度域决定 。
因为CHAP可以验证许多不同的系统,所以名字域的内容可以用作在秘密数据库查询秘
