当我在JavaScript中实现ChaCha20时,我偶然发现了一些奇怪的行为.
我的第一个版本是这样构建的(我们称之为"Encapsulated Version"):
function quarterRound(x, a, b, c, d) {
x[a] += x[b]; x[d] = ((x[d] ^ x[a]) << 16) | ((x[d] ^ x[a]) >>> 16);
x[c] += x[d]; x[b] = ((x[b] ^ x[c]) << 12) | ((x[b] ^ x[c]) >>> 20);
x[a] += x[b]; x[d] = ((x[d] ^ x[a]) << 8) | ((x[d] ^ x[a]) >>> 24);
x[c] += x[d]; x[b] = ((x[b] ^ x[c]) << 7) | ((x[b] ^ x[c]) >>> 25);
}
function getBlock(buffer) {
var x …Run Code Online (Sandbox Code Playgroud) 我怎样才能NSFileHandleOperationException在Swift中找到一个?
我使用fileHandle.readDataToEndOfFile()哪些调用(根据文档)fileHandle.readDataOfLength()可以抛出(再次根据文档)a NSFileHandleOperationException.
我怎么能抓住这个例外?我试过了
do {
return try fH.readDataToEndOfFile()
} catch NSFileHandleOperationException {
return nil
}
Run Code Online (Sandbox Code Playgroud)
但Xcode说
警告:'try'表达式中不会调用抛出函数
警告:'catch'块无法访问,因为'do'块中没有抛出错误
我该怎么做呢?
编辑:我决定用C的好老fopen,fread,fclose作为一种解决方法:
extension NSMutableData {
public enum KCStd$createFromFile$err: ErrorType {
case Opening, Reading, Length
}
public static func KCStd$createFromFile(path: String, offset: Int = 0, length: Int = 0) throws -> NSMutableData {
let fh = fopen(NSString(string: path).UTF8String, NSString(string: "r").UTF8String)
if fh == nil { throw KCStd$createFromFile$err.Opening }
defer …Run Code Online (Sandbox Code Playgroud) 我想在我的swift项目中包含libgpg-error和libgcrypt,并创建了以下module.modulemaps:
libgpgerror:
module libgpgerror {
header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/gpg-error.h"
link "'/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib'"
export *
}
Run Code Online (Sandbox Code Playgroud)
libgcrypt:
module libgcrypt {
header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/gcrypt.h"
link "'/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/libgcrypt-1.6.5.dylib'"
export *
}
Run Code Online (Sandbox Code Playgroud)
我还/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/**为项目和目标添加了"Swift编译器 - 搜索路径/导入路径":找到模块,路径是正确的.
但是,如果我想编译项目,我会收到以下错误:
ld: library not found for -l'/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib' for architecture x86_64
Run Code Online (Sandbox Code Playgroud)
但如果我这样做
file /Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib
Run Code Online (Sandbox Code Playgroud)
我得到了输出
/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib: Mach-O 64-bit dynamically linked shared library x86_64
Run Code Online (Sandbox Code Playgroud)
因此,图书馆似乎位于正确的位置,并且具有正确的架构.
编辑
我找到了一个解决方法:我从模块映射中删除了link-directive并手动链接了这些库; 这似乎有效.但为什么?
module libgpgerror {
header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/gpg-error.h"
export *
}
Run Code Online (Sandbox Code Playgroud) 我希望这是正确的论坛; 我不确定我是否应该在stackoverflow,加密或安全性中问这个问题.
所以我的问题是php的hash_hmac函数仅适用于php> = 5.1.2.因为有些服务器没有更新到这个版本,所以我根据php的哈希函数编写了自己的HMAC实现.但代码不会产生与hash_hmac相同的输出...
那我的错误在哪里?
define("HASH_ALGO", "sha512");
define("HMAC_BLOCKSIZE", 64);
function computeHMAC($message, $key) {
$ikey;
$okey;
$zero = hex2bin("00");
$ipad = hex2bin("36");
$opad = hex2bin("5C");
/*
* HMAC construction scheme:
* $ikey = $key padded with zeroes to blocksize and then each byte xored with 0x36
* $okey = $key padded with zeroes to blocksize and then each byte xored with 0x5C
* hash($okey . hash($ikey . $message))
*/
//Hash key if it is larger than HMAC_BLOCKSIZE
if (strlen($key) > …Run Code Online (Sandbox Code Playgroud) 我试过天真的方法
fn main() -> Result<(), Box<std::error::Error>> {
let num = 0;
match num {
u64::max_value() => println!("Is u64::max_value()"),
_ => println!("Is boring")
}
Ok(())
}
Run Code Online (Sandbox Code Playgroud)
但它失败了expected tuple struct/variant, found method <u64>::max_value。
除了n if n == u64::max_value() => ...我可以使用的语法之外,还有其他语法吗?
我有一些struct像这样的:
struct myStruct0 {
void(*deallocMe)(void*); // points always to "myStruct0_dealloc"
uint8_t* someStuff;
void* someOtherStuff;
}
void myStruct0_dealloc(void* structPtr) {
myStruct0* s = (myStruct0*)structPtr;
free(s->someStuff);
free(s->someOtherStuff);
free(s);
}
struct myStruct1 {
void(*deallocMe)(void*); // points always to "myStruct1_dealloc"
uint8_t* someStuff;
uint64_t largeArray[4096];
void* someOtherStuff;
char* someRealOtherStuff;
}
void myStruct1_dealloc(void* structPtr) {
myStruct1* s = (myStruct1*)structPtr;
free(s->someStuff);
free(s->someOtherStuff);
free(s->someRealOtherStuff);
free(s);
}
Run Code Online (Sandbox Code Playgroud)
无论structS和指针使用分配的malloc(当然不能是NULL).
以下代码是否安全?
struct genericForm {
void(*deallocMe)(void*);
}
void deallocMyStructX(void* myStructX) {
genericForm* x = (genericForm*)myStructX;
x->deallocMe(myStructX);
}
Run Code Online (Sandbox Code Playgroud)
我为什么要这样做? …
我有一个函数需要两个指针,一个指向字符串对象,另一个指向自定义KCData对象:
void KCConverter::dataToHexStringBuf(std::string *hexStringBuf, KCData *data) {
char hexBuf[2];
size_t position = data->getPosition();
size_t length = data->getLength();
uint8_t *copy = new uint8_t[data->getLength()];
memcpy(copy, data->bytes, data->getLength());
uint8_t current;
for (size_t i = position; i < length; i++) {
std::cout << "Reading char " << i << std::endl;
current = copy[i];
sprintf(hexBuf, "%02X", current);
hexStringBuf->push_back(hexBuf[0]);
hexStringBuf->push_back(hexBuf[1]);
}
data->setPosition(data->getLength());
}
Run Code Online (Sandbox Code Playgroud)
但是,for循环中KCData指针的值正在改变:
第一次迭代:

第二次迭代:

第三次迭代:

但是,如果我取消注释该行sprintf(hexBuf, "%02X", current);,则指针不再更改.但为什么要sprintf更改data???? 的指针地址?
PS:如果你把我的问题投下来,那么了解原因会很好,所以我可以改进我的问题:)