coturn源码之SASLprep()函数

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。

原文地址:https://www.cnblogs.com/iuyy/p/13456814.html