Sodium是一个现代,简单易用的软件库,主要用途加密,解密,签名,验签,秘钥衍生,秘钥Hash等。
它是一种便携,可交叉编译,可安装,“NaCl”库衍生版,具有兼容的API,以及扩展API,以进一步提高可用性。其目标是提供构建更高级别加密工具所需的所有核心操作。Sodium支持多种编译打包方式,及多种运行平台Windows (with MinGW \ Visual Studio, x86 and x86_64), iOS , Android。设计选择强调安全性,“魔法常量”有明确的理由。尽管强调高安全性,但是原语比NIST标准的大多数实现更快。
2016.07.31 1.0.11发布
下载文档
https://www.gitbook.com/book/jedisct1/libsodium/details
License
ISC license.
用例:
#include <sodium.h>
int main(void) {
if (sodium_init() == -1) {
return 1;
}
}
sodium.h 是唯一需要引入的.
sodium被称为钠(使用-lsodium 链接它),并且可以在其可用的系统上使用pkg-config获得适当的编译/链接器标记
CFLAGS=
(pkg−config–cflagslibsodium)LDFLAGS=
(pkg-config –libs libsodium)
对于静态链接, Visual Studio 用户应该定义SODIUM_STATIC=1 and SODIUM_EXPORT=. 在其它平台上面不需要.
sodium_init() 初始化库,并且必须在任何方法调用之前调用。该方法可以被多次调用,1.0.11开始支持多线程版本。
在改方法调用之后,所有的其它方法调用都是现成安全的。
sodium_init()不执行任何内存分配。但是,在Unix系统上,它可以打开/dev/urandom并保持描述符打开,这样设备在chroot()调用后仍然可以访问。对钠sodium_init()的多次调用不会导致打开其他描述符。
sodium_init() 成功返回0,失败返回-1,已经有实例存在返回1.
平等的恒定时间测试
int sodium_memcmp(const void * const b1_, const void * const b2_, size_t len);
当比较涉及加密数据(例如密钥,认证标签)时,使用恒定时间比较功能以减轻侧信道攻击是至关重要的。
sodium_memcmp()功能主要用于此.
sodium_memcmp() 成功返回0,失败返回-1,已经有实例存在返回1.
注意: sodium_memcmp()不是比较器,不是memcmp()的替代。
char sodium_bin2hex(char const hex, const size_t hex_maxlen,
const unsigned char * const bin, const size_t bin_len);
描述:
参数说明:
bin : byte[]数组转化为十六进制字符串.生成的字符串保存在hex参数中,结尾为(\0);
hex_maxlen : 是允许函数以十六进制开始写入的最大字节数,最短为bin_len * 2 + 1。
返回:
成功:十六进制
失败:溢出时为NULL。它在给定大小的恒定时间内进行评估
int sodium_hex2bin(unsigned char * const bin, const size_t bin_maxlen,
const char * const hex, const size_t hex_len,
const char * const ignore, size_t * const bin_len,
const char ** const hex_end);
描述:函数解析十六进制字符串hex,并将其转换为字节序列。当发现非十六进制,不被忽略的字符或者已经写入bin_maxlen字节时,解析器停止。它在给定长度和格式的恒定时间内求值。
参数说明:
bin_maxlen : 放入bin的最大字节数。
hex : hex并不需要以nul结尾。
hex_len : 要解析的字符数通过hex_len参数传入。
ignore : 要跳过的字符串。例如,字符串“:”允许列和空格出现在十六进制字符串中的任何位置。这些字符将被忽略。因此,“69: FC”,“69 FC”,“69:FC”和“69FC”将是有效输入,并将产生相同的输出,可以设置为NULL,以禁止任何非十六进制字符。
返回:
成功:0 并将hex_end(如果不为NULL)设置为指向最后一个解析字符后面的字符的指针。
失败:-1 如果需要超过bin_maxlen字节来存储解析的字符串,函数将返回-1
void sodium_increment(unsigned char *n, const size_t nlen);
描述:获得指向任意长无符号数的指针,并递增它。它以恒定时间运行给定长度,并且考虑要以低位格式编码的数字。该方法能被在随机数的自增长上(后面的对称加密算法用用到),该方法在1.0.4被引入。
参数说明:
*n : 返回已经增加过的数组;
nlen : *n的长度。
返回:
成功:unsigned char *n
void sodium_add(unsigned char *a, const unsigned char *b, const size_t len);
描述:函数接受以小尾数格式a和b编码的无符号数的两个指针,两个长度大小都为len字节,在给定长度的恒定时间中计算(a + b)mod 2 ^(8 * len),并用结果重写a,该方法在1.0.7被引入。
参数说明:
*a : 指针,byte数组
*b : ..
len : a,b 长度
返回:*a
int sodium_compare(const void * const b1_, const void * const b2_, size_t len);
描述:给定的b1_ 和 b2_,采用低位模式,该方法可以使用在数据数的比对上,判断防重放攻击。该方法在1.0.6被引入。
参数说明:
b1_ : 指针,byte数组
b2_ : 指针,byte数组
len : a,b 长度
返回:
1. -1 如果b1_ < b2_
2. 0 如果b1_ = b2_
3. 1 如果b1_ > b2_
int sodium_is_zero(const unsigned char *n, const size_t nlen);
描述:此函数返回1指向nlen字节向量如果只包含零。如果找到非零位,则返回0。该方法在1.0.7被引入。
参数说明:
*n : 指针,byte数组
nlen : a,b 长度
返回:
0 : 如果找到非零位。
1 : nlen字节向量如果只包含零。