Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SecKeyRawSign返回OSStatus=noErr,但返回随机签名对象_Ios_Security_Digital Signature_Seckeyref - Fatal编程技术网

Ios SecKeyRawSign返回OSStatus=noErr,但返回随机签名对象

Ios SecKeyRawSign返回OSStatus=noErr,但返回随机签名对象,ios,security,digital-signature,seckeyref,Ios,Security,Digital Signature,Seckeyref,我正在使用SecKeyRawSign对PDF的SHA摘要进行数字签名,并且SecKeyRawSignreports OSStatus=noErr,但我每次运行项目时都会得到随机签名对象 privateKey始终相同(保存在钥匙链中)。我还验证了文档摘要是否相同(转换为base64和hexdump) 所以问题是:给定相同的输入,SecKeyRawSign报告status=noErr,但输出不同 这是我正在使用的代码: NSData *hashData = [self getHashData]; S

我正在使用
SecKeyRawSign
对PDF的SHA摘要进行数字签名,并且
SecKeyRawSign
reports OSStatus=noErr,但我每次运行项目时都会得到随机签名对象

privateKey始终相同(保存在钥匙链中)。我还验证了文档摘要是否相同(转换为base64和hexdump)

所以问题是:给定相同的输入,SecKeyRawSign报告status=noErr,但输出不同

这是我正在使用的代码:

NSData *hashData = [self getHashData];
SecKeyRef privateKey = [self getPrivateKeyFromKeychain];

size_t signatureBytesSize = SecKeyGetBlockSize(privateKey); 
uint8_t *signatureBytes = malloc(signatureBytesSize * sizeof(uint8_t));
memset((void *)signatureBytes, 0x0, signatureBytesSize);

OSStatus status = noErr;
status = SecKeyRawSign(privateKey, kSecPaddingSHA1, (const unsigned char *)hashData.bytes, SecKeyGetBlockSize(privateKey), signatureBytes, &signatureBytesSize);

if (status == noErr) {
    NSLog(@"Signing OK");
    NSLog(@"Signature: \"%s\"", signatureBytes);
} else {
    NSLog(@"Error signing data: result code: %d", (int)status);
}
我总是得到status=noErr,“Signing OK”,但signatureBytes是随机的,大小也是随机的

我试过用不同的填充物。还将签名缓冲区大小设置为密钥大小-11(根据文档)

在研究文档时,我找不到关于签名对象类型(sig)的详细信息。我假设可以转换为Base64的是原始字节


任何帮助都将不胜感激。。。。e

我发现了问题,能够对PDF哈希签名并验证签名。 我在
SecKeyRawSign
dataToSignLen
变量中使用了
SecKeyGetBlockSize(privateKey)
而不是
hashData.length

size_t signatureBytesSize = SecKeyGetBlockSize(privateKey);
uint8_t *signatureBytes = malloc(signatureBytesSize * sizeof(uint8_t));
memset((void *)signatureBytes, 0x0, signatureBytesSize);
OSStatus signStatus = SecKeyRawSign(directPrivateKey, kSecPaddingPKCS1SHA1, (const unsigned char *)hashData.bytes, hashData.length, signatureBytes, &signatureBytesSize);