Экспорт открытого ключа в распакованное (x,y) представление начинается с 0x04 и имеет длину 65 байтов
Ниже приведен пример кода для генерации закрытого ключа (ссылка на gist): https://gist.github.com/kynwu/3a65e238fcd189d516bb2de59527a320
после генерации закрытого ключа я вывел открытый ключ, вызвав SecKeyCopyPublicKey((SecKeyRef)privateKey)
Я получил ниже значение, показывающее (x,y) открытого ключа.
<SecKeyRef curve type: kSecECCurveSecp256r1, algorithm id: 3, key type: ECPublicKey, version: 4, block size: 256 bits, y: 1778DB79819A67BC9211E003557CB55EA0C7A19154B1C0828B30F30AD208ABCD, x: 7A1C65A955F46B9937A12E19139DE25C3F19368A3C2DD7360791E42382C98716, addr: 0x1003019f0>
Теперь я хочу передать это (х, у) 0x04|x-32bytes|y-32bytes
двоичные данные размером 65 байт, поэтому я могу вывести этот двоичный файл, представляющий открытый ключ для сервера. Как этого добиться?
0 ответов
Используйте метод CFDictionaryGetValue в CoreFoundation.
const void * CFDictionaryGetValue (CFDictionaryRef theDict, const void * key);
Ниже функция выдаст 65 байт открытого несжатого ключа.
+ (NSData *) publicKeyBits
{
return (NSData *) CFDictionaryGetValue((CFDictionaryRef)[self lookupPublicKeyRef], kSecValueData);
}
+ (SecKeyRef) lookupPublicKeyRef
{
CFMutableDictionaryRef getPublicKeyQuery = newCFDict;
CFDictionarySetValue(getPublicKeyQuery, kSecClass, kSecClassKey);
CFDictionarySetValue(getPublicKeyQuery, kSecAttrKeyType, kSecAttrKeyTypeEC);
CFDictionarySetValue(getPublicKeyQuery, kSecAttrApplicationTag, kPublicKeyName);
CFDictionarySetValue(getPublicKeyQuery, kSecAttrKeyClass, kSecAttrKeyClassPublic);
CFDictionarySetValue(getPublicKeyQuery, kSecReturnData, kCFBooleanTrue);
CFDictionarySetValue(getPublicKeyQuery, kSecReturnPersistentRef, kCFBooleanTrue);
OSStatus status = SecItemCopyMatching(getPublicKeyQuery, (CFTypeRef *)&publicKeyRef);
if (status == errSecSuccess)
return (SecKeyRef)publicKeyRef;
else if (status == errSecItemNotFound)
return nil;
else
[NSException raise:@"Unexpected OSStatus" format:@"Status: %i", status];
return false;
}
- kPublicKeyName может быть любой константной строкой, которая будет связана как тег с открытым ключом.
например - #define kPublicKeyName @"com.trailer.ECKey.public"