//
// PrivateKey.swift
// SwiftyRSA
//
// Created by Lois Di Qual on 5/17/17.
// Copyright © 2017 Scoop. All rights reserved.
//
import Foundation
public class PrivateKey: Key {
/// Reference to the key within the keychain
public let reference: SecKey
/// Original data of the private key.
/// Note that it does not contain PEM headers and holds data as bytes, not as a base 64 string.
public let originalData: Data?
let tag: String?
/// Returns a PEM representation of the private key.
///
/// - Returns: Data of the key, PEM-encoded
/// - Throws: SwiftyRSAError
public func pemString() throws -> String {
let data = try self.data()
let pem = SwiftyRSA.format(keyData: data, withPemType: "RSA PRIVATE KEY")
return pem
}
/// Creates a private key with a keychain key reference.
/// This initializer will throw if the provided key reference is not a private RSA key.
///
/// - Parameter reference: Reference to the key within the keychain.
/// - Throws: SwiftyRSAError
public required init(reference: SecKey) throws {
guard SwiftyRSA.isValidKeyReference(reference, forClass: kSecAttrKeyClassPrivate) else {
throw SwiftyRSAError.notAPrivateKey
}
self.reference = reference
self.tag = nil
self.originalData = nil
}
/// Creates a private key with a RSA public key data.
///
/// - Parameter data: Private key data
/// - Throws: SwiftyRSAError
required public init(data: Data) throws {
self.originalData = data
let tag = UUID().uuidString
self.tag = tag
let dataWithoutHeader = try SwiftyRSA.stripKeyHeader(keyData: data)
reference = try SwiftyRSA.addKey(dataWithoutHeader, isPublic: false, tag: tag)
}
deinit {
if let tag = tag {
SwiftyRSA.removeKey(tag: tag)
}
}
}