RFC4013文档定义了准备国际化用户名和密码的规则,为了简化和简化实现,为用户名和密码定义了一个算法。本质上就是按照一个规则对输入字符串进行规范化输出,更多规范化规则可以参考RFC3454:Preparation of Internationalized Strings ("stringprep"),而RFC4013仅仅视为了用户名和密码定义了一个相同的规范化算法。
/* We support only basic ASCII table */
int SASLprep(uint8_t *s){ if(s) { uint8_t *strin = s; uint8_t *strout = s; for(;;) { uint8_t c = *strin; if(!c) { *strout=0; break; } switch(c) { case 0xAD: ++strin; break; case 0xA0: case 0x20: *strout=0x20; ++strout; ++strin; break; case 0x7F: return -1; default: if(c<0x1F) return -1; if(c>=0x80 && c<=0x9F) return -1; *strout=c; ++strout; ++strin; }; } } return 0; }
对RFC4013文档的兴趣来源于对coturn源码的阅读,上面这个函数SASLprep()就是校验一个字符串是否符合RFC4013的文档规范,但正如它所注释的那样,这个代码仅仅实现了规范的一部分。
但是,这份代码确是错误的,这三行代码*strout=0; *strout=0x20; *strout=c;赋值错误,因为右值(*strout)不允许被赋值,代码本意应该是让对应地址处的内容重写!
参考文档:RFC4013、RFC3454。