SecKeyRawSign returns OSStatus = noErr,但随机签名对象
SecKeyRawSign returns OSStatus = noErr, but random signature objects
我正在使用 SecKeyRawSign
对 PDF 的 SHA 摘要进行数字签名,并且 SecKeyRawSign
报告 OSStatus = noErr,但是我每次 运行 项目时都会得到随机签名对象.
私钥始终相同(保存在钥匙串中)。我还验证了文档摘要是相同的(转换为 base64 并使用 hexdump)
所以问题是:给定相同的输入,SecKeyRawSign 报告状态 = 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);
我正在使用 SecKeyRawSign
对 PDF 的 SHA 摘要进行数字签名,并且 SecKeyRawSign
报告 OSStatus = noErr,但是我每次 运行 项目时都会得到随机签名对象.
私钥始终相同(保存在钥匙串中)。我还验证了文档摘要是相同的(转换为 base64 并使用 hexdump)
所以问题是:给定相同的输入,SecKeyRawSign 报告状态 = 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);