From 7564cfa8c412457a0e7564ff80d32d2c741906cf Mon Sep 17 00:00:00 2001 From: Kristy Brambila Date: Thu, 26 Sep 2019 10:36:57 -0700 Subject: [PATCH] Refactor Ed25519PrivateKey to store the whole keypair instead of just the private key bytes --- .../crypto/ed25519/Ed25519PrivateKey.swift | 27 ++++++++++--------- .../ed25519/Ed25519PrivateKeyTests.swift | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Sources/Hedera/crypto/ed25519/Ed25519PrivateKey.swift b/Sources/Hedera/crypto/ed25519/Ed25519PrivateKey.swift index 4085dd73..3d8f284b 100644 --- a/Sources/Hedera/crypto/ed25519/Ed25519PrivateKey.swift +++ b/Sources/Hedera/crypto/ed25519/Ed25519PrivateKey.swift @@ -4,14 +4,21 @@ let ed25519PrivateKeyPrefix = "302e020100300506032b657004220420" let ed25519PrivateKeyLength = 32 let combinedEd25519KeyLength = 64 +// TODO: init using a pem file + public struct Ed25519PrivateKey { - private let inner: Bytes + private let inner: Sign.KeyPair + + /// Generate a new private key + public init() { + inner = sodium.sign.keyPair()! + } public init?(bytes: Bytes) { if bytes.count == ed25519PrivateKeyLength { - inner = bytes + inner = sodium.sign.keyPair(seed: bytes)! } else if bytes.count == combinedEd25519KeyLength { - inner = Bytes(bytes.prefix(ed25519PrivateKeyLength)) + inner = sodium.sign.keyPair(seed: Bytes(bytes.prefix(ed25519PrivateKeyLength)))! } else { // Invalid key length return nil @@ -19,21 +26,17 @@ public struct Ed25519PrivateKey { } public var bytes: Bytes { - inner - } - - public static func generate() -> Ed25519PrivateKey { - Ed25519PrivateKey(bytes: sodium.sign.keyPair()!.secretKey)! + inner.secretKey } public var publicKey: Ed25519PublicKey { - Ed25519PublicKey(bytes: sodium.sign.keyPair(seed: inner)!.publicKey)! + Ed25519PublicKey(bytes: inner.publicKey)! } } extension Ed25519PrivateKey: CustomStringConvertible, CustomDebugStringConvertible { public var description: String { - hexEncode(bytes: inner, prefixed: ed25519PrivateKeyPrefix) + hexEncode(bytes: inner.secretKey, prefixed: ed25519PrivateKeyPrefix) } public var debugDescription: String { @@ -47,14 +50,14 @@ extension Ed25519PrivateKey: LosslessStringConvertible { switch description.count { case ed25519PrivateKeyLength * 2, combinedEd25519KeyLength * 2: // lone key, or combined key guard let decoded = try? hexDecode(description) else { return nil } - inner = decoded + self = Ed25519PrivateKey(bytes: decoded)! case ed25519PrivateKeyLength * 2 + ed25519PrivateKeyPrefix.count: // DER encoded key guard description.hasPrefix(ed25519PrivateKeyPrefix) else { return nil } let range = description.index(description.startIndex, offsetBy: ed25519PrivateKeyPrefix.count)... guard let decoded = try? hexDecode(description[range]) else { return nil } - inner = decoded + self = Ed25519PrivateKey(bytes: decoded)! default: return nil diff --git a/Tests/HederaTests/crypto/ed25519/Ed25519PrivateKeyTests.swift b/Tests/HederaTests/crypto/ed25519/Ed25519PrivateKeyTests.swift index 112eaf9a..6ec61c67 100644 --- a/Tests/HederaTests/crypto/ed25519/Ed25519PrivateKeyTests.swift +++ b/Tests/HederaTests/crypto/ed25519/Ed25519PrivateKeyTests.swift @@ -12,7 +12,7 @@ let combinedKeyBytes = Array(arrayLiteral: 219, 72, 75, 130, 142, 100, 17 final class Ed25519PrivateKeyTests: XCTestCase { func testGenerate() { - XCTAssertNoThrow(Ed25519PrivateKey.generate()) + XCTAssertNoThrow(Ed25519PrivateKey()) } func testFromBytes() {