argon2id_hash_raw 不需要 C 字符串(以 NUL 字节结尾),而是 uint8_t 数组。因此长度是一个单独的参数,请参阅https://github.com/PHC/phc-winner-argon2/blob/master/src/argon2.c第 136 - 137 行:
context.salt = CONST_CAST(uint8_t *)salt;
context.saltlen = (uint32_t)saltlen;
由于您在 Swift 中有一个十六进制编码的字符串,您可以使用这个不错的答案https://stackoverflow.com/a/43360864将其转换为 UInt8 数组。
测试
如果我们定义一个小的 C 函数只是为了测试转换,它可能看起来像这样:
#include <stdio.h>
#include "some_cfile.h"
void print_salt(const uint8_t *salt, uint32_t len) {
for(uint32_t i = 0; i < len; i++) {
printf("%x ", salt[i]);
}
printf("\n");
}
为了完整起见,测试头文件将如下所示:
#ifndef some_cfile_h
#define some_cfile_h
#include <inttypes.h>
void print_salt(const uint8_t *salt, uint32_t len);
#endif /* some_cfile_h */
在 Swift 方面,这将被调用如下:
struct Context {
let salt: String
}
...
let context = Context(salt: "687568")
...
let salt = context.salt.hexaBytes
print_salt(salt, UInt32(salt.count))
这个测试最终给出了预期的输出:
68 75 68