Я пытаюсь прочитать закрытый ключ из сертификата в системной цепочке для ключей на клиенте, чтобы подписать случайные данные, отправленные сервером.
Я использую приведенный ниже код.
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, я не уверен, как это сделать, и возможно ли это или нет.
Любая помощь будет принята с благодарностью.
Задача ещё не решена.
Других решений пока нет …