В Swift я создал объект SecKeyRef
, вызвав SecTrustCopyPublicKey
на некотором необработанном X509 данные сертификата. Вот как выглядит этот объект SecKeyRef
.
Optional(<SecKeyRef algorithm id: 1,
key type: RSAPublicKey,
version: 3, block size: 2048 bits,
exponent: {hex: 10001, decimal: 65537},
modulus: <omitted a bunch of hex data>,
addr: 0xsomeaddresshere>)
В принципе, этот объект SecKeyRef
содержит целую кучу информации о публичном ключе, но, похоже, нет способа фактически преобразовать этот SecKeyRef
в строку, NSData
или что-нибудь еще (это мой цель, это просто получить открытый ключ base64).
Однако у меня есть функция, которую я могу дать modulus
и exponent
, и она просто вычислит, что такое открытый ключ. Я протестировал его, передав данные, записанные из вышеперечисленного SecKeyRef
.
Но каким-то образом я не могу получить доступ к этим свойствам из объекта SecKeyRef
(я могу видеть только весь объект в консоли, например, я не могу сделать SecKeyRef.modulus
или что-то в этом роде, кажется ).
Мой вопрос: как я могу получить доступ к SecKeyRef.modulus
или, наоборот, преобразовать этот SecKeyRef
в NSData
или что-то подобное? Спасибо
Изменить
(для получения дополнительной информации)
Я динамически создаю свой SecKeyRef
, используя эту функцию:
func bytesToPublicKey(certData: NSData) -> SecKeyRef? {
guard let certRef = SecCertificateCreateWithData(nil, certData) else { return nil }
var secTrust: SecTrustRef?
let secTrustStatus = SecTrustCreateWithCertificates(certRef, nil, &secTrust)
if secTrustStatus != errSecSuccess { return nil }
var resultType: SecTrustResultType = UInt32(0) // result will be ignored.
let evaluateStatus = SecTrustEvaluate(secTrust!, &resultType)
if evaluateStatus != errSecSuccess { return nil }
let publicKeyRef = SecTrustCopyPublicKey(secTrust!)
return publicKeyRef
}
Что это делает, он берет поток сырого байта из сертификата (который может транслироваться, скажем, с помощью аппаратного обеспечения с помощью PKI), а затем превращает его в SecKeyRef
.
Изменить 2
(комментарии по существующим ответам от 7 января 2015 года)
Это не работает:
let mirror = Mirror(reflecting: mySecKeyObject)
for case let (label?, value) in mirror.children {
print (label, value)
}
В результате этот результат выводится на консоль:
Some <Raw SecKeyRef object>
Не уверен, что означает строка "Некоторые".
Кроме того, mirror.descendant("exponent")
(или "модуль" ) приводит к nil
, хотя при печати необработанного объекта в консоли я могу ясно видеть, что эти свойства существуют и что они фактически заполнены.
Кроме того, если возможно, , я бы хотел избежать сохранения в цепочке ключей, считая NSData
, а затем удаляя из брелка. Как указано в описании награды, если это единственный возможный способ, просьба привести авторитетную ссылку. Спасибо за все предоставленные ответы.