从守护程序访问没有密码的钥匙串

时间:2018-07-30 19:23:28

标签: c++ objective-c macos certificate keychain

我正在尝试从客户端系统钥匙串中的证书中读取私钥,以对服务器发送的随机数据进行签名。

我正在使用以下代码。

std::string osxPrivateKey::signData(const uint8_t* pData, uint32_t nDataSize, vector<uint8_t>& aSignature) {
    const char* str = (const char*)pData;
    unsigned char *result = new unsigned char[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(str, strlen(str), result);

    CFDataRef myData = CFDataCreate(NULL, result, CC_SHA256_DIGEST_LENGTH);
    CFErrorRef error;

    osxObject<SecTransformRef> signer;
    SecTransformRef signerRef = SecSignTransformCreate(m_oKey.get(), &error);
    signer.set(signerRef);

    //SecTransformSetAttribute(signer.get(), kSecTransformDebugAttributeName, kCFBooleanTrue, &error);
    SecTransformSetAttribute(signer.get(), kSecTransformInputAttributeName, myData, &error);
    //SecTransformSetAttribute(signer.get(), kSecInputIsAttributeName , kSecInputIsPlainText, &error);
    SecTransformSetAttribute(signer.get(), kSecInputIsAttributeName , kSecInputIsDigest, &error);
    //SecTransformSetAttribute(signer.get(), kSecInputIsAttributeName , kSecInputIsRaw, &error);
    SecTransformSetAttribute(signer.get(), kSecPaddingKey, kSecPaddingPKCS1Key, &error);
    //SecTransformSetAttribute(signer.get(), kSecPaddingKey, kSecPaddingPKCS5Key, &error);
    SecTransformSetAttribute(signer.get(), kSecEncodeLineLengthAttribute, kSecLineLength64, &error);
    SecTransformSetAttribute(signer.get(), kSecDigestTypeAttribute, kSecDigestSHA2, NULL);

    int digestLength = 256;
    CFNumberRef dLen = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &digestLength);
    SecTransformSetAttribute(signer.get(), kSecDigestLengthAttribute, dLen, &error);
    CFRelease(dLen);

    CFDataRef signature = (CFDataRef)SecTransformExecute(signer.get(), &error);


    unsigned char* signData = new unsigned char[1024];
    int size = CFDataGetLength(signature);
    CFDataGetBytes(signature, CFRangeMake(0,CFDataGetLength(signature)), (UInt8*)(signData));

    char* encodeBase64SignData = new char[1024];
    //internal library to convert binary to base64 encoding
    hc::encodeBase64((const char*)signData, size, encodeBase64SignData, 1023);
    encodeBase64SignData[1023] = '\0';

    delete encodeBase64SignData;
    delete signData;

    return string(encodeBase64SignData);
}

此代码在客户端上作为守护程序的一部分运行。我已经使用相同的代码编写了一个测试应用程序,当我执行测试应用程序时,它会提示我输入用户名/密码以访问钥匙串。提供用户名/密码后,一切正常。

但是当我通过守护程序(客户端-服务器通信)执行相同的代码时,它不会提示输入用户名/密码。那么,由于守护程序以系统用户身份运行,是否有任何方法或API可以跳过所需的密码?如果没有,如何提示守护程序输入用户名/密码?

由于我是OSX的新手,所以我不确定该怎么做或不确定是否可行。 任何帮助将不胜感激。

0 个答案:

没有答案