Skip to content

Commit 9fde232

Browse files
committed
Added PEM import and export tests
1 parent b8dfcca commit 9fde232

File tree

1 file changed

+102
-17
lines changed

1 file changed

+102
-17
lines changed

Tests/PeerIDTests/PeerIDTests.swift

Lines changed: 102 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,6 @@ final class PeerIDTests: XCTestCase {
274274
}
275275

276276
func testFromMarshaledPrivateKey() throws {
277-
278277
let marshaledPeerIDData = Data(hex: PeerIDTests.samplePeerID.marshaled) //try Multihash(hexString: "f\(PeerIDTests.samplePeerID.marshaled)").value
279278
let protoPeerID = try PeerIdProto(contiguousBytes: marshaledPeerIDData)
280279

@@ -304,7 +303,6 @@ final class PeerIDTests: XCTestCase {
304303
/// Imports a SecKey from the raw data
305304
/// Extracts/derives a Public Key from the Private Key
306305
func testFromMarshaledPrivateKey_GO() throws {
307-
308306
let marshaledPrivateKey = try BaseEncoding.decode(PeerIDTests.goPeerID.privKey, as: .base64Pad)
309307

310308
let peerID = try PeerID(marshaledPrivateKey: marshaledPrivateKey.data)
@@ -316,10 +314,8 @@ final class PeerIDTests: XCTestCase {
316314
XCTAssertEqual(pid, PeerIDTests.goPeerID.id)
317315
}
318316

319-
/// Marshaling Private RSA Keys aren't supported yet on Linux
320-
#if canImport(Security)
317+
/// Marshaling Private RSA Keys
321318
func testFromMarshaledPrivateKey_GO_2() throws {
322-
323319
let peerID = try PeerID(marshaledPrivateKey: PeerIDTests.goPeerID.privKey, base: .base64Pad)
324320

325321
XCTAssertEqual(peerID.b58String, PeerIDTests.goPeerID.id)
@@ -332,13 +328,9 @@ final class PeerIDTests: XCTestCase {
332328

333329
XCTAssertEqual(marshaledPrivKey.asString(base: .base64Pad), PeerIDTests.goPeerID.privKey)
334330
}
335-
#endif
336331

337-
/// 3.052, 3.096 (using multibase library)
338-
/// 0.135, 0.134 (using Data(hex: ))
339332
func testToJSONPublic() throws {
340-
//let peerID = try PeerID(marshaledPeerID: PeerIDTests.samplePeerID.marshaled, base: .base16)
341-
let peerID = try PeerID(marshaledPeerID: Data(hex: PeerIDTests.samplePeerID.marshaled))
333+
let peerID = try PeerID(marshaledPeerID: PeerIDTests.samplePeerID.marshaled, base: .base16)
342334

343335
let publicJSON = try peerID.toJSON(includingPrivateKey: false)
344336

@@ -357,10 +349,8 @@ final class PeerIDTests: XCTestCase {
357349
XCTAssertNil(pubID.keyPair?.privateKey)
358350
}
359351

360-
#if canImport(Security)
361352
func testToJSONFull() throws {
362-
//let peerID = try PeerID(marshaledPeerID: PeerIDTests.samplePeerID.marshaled, base: .base16)
363-
let peerID = try PeerID(marshaledPeerID: Data(hex: PeerIDTests.samplePeerID.marshaled))
353+
let peerID = try PeerID(marshaledPeerID: PeerIDTests.samplePeerID.marshaled, base: .base16)
364354

365355
let fullJSON = try peerID.toJSON(includingPrivateKey: true)
366356
let publicJSON = try peerID.toJSON(includingPrivateKey: false)
@@ -400,12 +390,104 @@ final class PeerIDTests: XCTestCase {
400390
XCTAssertEqual(pubID.keyPair?.publicKey.asString(base: .base64), fullID.keyPair?.publicKey.asString(base: .base64))
401391
XCTAssertNotEqual(pubID.keyPair?.privateKey?.asString(base: .base64), fullID.keyPair?.privateKey?.asString(base: .base64))
402392
}
403-
#endif
393+
394+
func testImportExportEncryptedPEM() throws {
395+
/// The encrypted version of an RSA 1024 Private Key
396+
///
397+
/// Encrypted with
398+
/// ```
399+
/// openssl pkcs8
400+
/// -in foo.pem
401+
/// -topk8
402+
/// -v2 aes-128-cbc
403+
/// -passout pass:mypassword
404+
/// ```
405+
let ENCRYPTED = """
406+
-----BEGIN ENCRYPTED PRIVATE KEY-----
407+
MIICzzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQI49PtP+7yJmgCAggA
408+
MB0GCWCGSAFlAwQBAgQQYz/oWtq4qhWPNrAQiO3i5wSCAoCjWvOSqAMdA4qDF8BB
409+
aaqGRnZ/Lvewsrs4keppFogFnYpeVkzEmeleQLIYkO2mnNvsjhfh2Vk1LW/qNPIl
410+
NvwjXyNbP1E6TlLmTNEAgIfyViHOCuk+17tkgAtK98huFTi0U+LbMcaxSnJ7CsNY
411+
9JODko7fLXMpEaGy5qcuXWsMHG1iKcggYs0J1kmWSVw9ZQP7Uh9hs31zz60kFe+T
412+
1I8EOjC06EcKY2HmOhzS+p378nWD3Lxi49FWkHslx1OtQwAXqMG5xWSo+kTWgmUx
413+
fB3Olmv7opDcQ5OtOSxRjM/6SCtrtIlPRjIS7Uu4foW2BpFS+mkkvaJR0lMiEFjA
414+
qMdLu3MZzT8U9lEDpd+ki+OjIC2bOXkv/OgHFmHjrTrGTVnK+HP5B0XkcaN0kmi5
415+
ypd8/XB4zDqO/eSSTKnDe5cvw9Ruj5vt9cesUGjckTlVlZ7Sip2nqtngEAh0k7gc
416+
p8p0LpNRyOM5edxNCsRLWj3Z9oskkbEFbL3INuVr6HZ5C1IpUHaxzdii1FBeLSqY
417+
RYCC7iOgfqRILkBN2dsnWhdLLvcVpeQqSccnNCYSrXgr40T8BqZKLnuhHT7/iZaw
418+
OiKp9MyygPf0wO5IFaSglpk02dohJpg/LYxFBZk+qJKPR9883NrtSPSzXxDogu2f
419+
/tc8OCoH919cB8WAsU1cvKYMxsr9HTfoxS7itrJX9d7tE3J2Ky7fQrPWt247BXSE
420+
FMUJ8BQpLL/2lNIxW9clLEuzr0RZKu3AhBU0V0o8KDucrsLPdbLvV9/J8+G8VJWB
421+
DZjkXrHO2Oob0rOBtz0gnIF4TSwMWlI28OFWLwN3ByGeT0KcDN7SghLtDSyEQKNW
422+
ZHiA
423+
-----END ENCRYPTED PRIVATE KEY-----
424+
"""
425+
426+
let peerID = try PeerID(pem: ENCRYPTED, password: "mypassword")
427+
XCTAssertNotNil(peerID.keyPair)
428+
XCTAssertNotNil(peerID.keyPair?.publicKey)
429+
XCTAssertNotNil(peerID.keyPair?.privateKey)
430+
XCTAssertEqual(peerID.type, .isPrivate)
431+
XCTAssertEqual(peerID.keyPair?.keyType, .rsa)
432+
433+
/// Every time we export the encrypted PEM it should be unique (unless you manually set the IV using swift-libp2p-crypto)
434+
let export1 = try peerID.exportKeyPair(as: .privatePEMString(encryptedWithPassword: "mypassword"))
435+
let export2 = try peerID.exportKeyPair(as: .privatePEMString(encryptedWithPassword: "mypassword"))
436+
437+
XCTAssertNotEqual(export1, ENCRYPTED)
438+
XCTAssertNotEqual(export2, ENCRYPTED)
439+
XCTAssertNotEqual(export1, export2)
440+
XCTAssertEqual(export1.count, export2.count)
441+
XCTAssertEqual(export1.count, ENCRYPTED.count)
442+
443+
/// Ensure the wrong passwords throw errors
444+
XCTAssertThrowsError(try PeerID(pem: ENCRYPTED, password: ""))
445+
XCTAssertThrowsError(try PeerID(pem: ENCRYPTED, password: "MyPassword"))
446+
XCTAssertThrowsError(try PeerID(pem: ENCRYPTED, password: nil))
447+
}
448+
449+
func testImportExportED25519PeerID() throws {
450+
let peerID = try PeerID(.Ed25519)
451+
let export = try peerID.exportKeyPair(as: .privatePEMString(encryptedWithPassword: "mypassword"))
452+
453+
print(export)
454+
455+
let imported = try PeerID(pem: export, password: "mypassword")
456+
457+
XCTAssertNotNil(imported.keyPair)
458+
XCTAssertNotNil(imported.keyPair?.privateKey)
459+
XCTAssertEqual(imported.keyPair?.privateKey?.rawRepresentation, peerID.keyPair?.privateKey?.rawRepresentation)
460+
XCTAssertEqual(imported, peerID)
461+
462+
/// Ensure the wrong passwords throw errors
463+
XCTAssertThrowsError(try PeerID(pem: export, password: ""))
464+
XCTAssertThrowsError(try PeerID(pem: export, password: "MyPassword"))
465+
XCTAssertThrowsError(try PeerID(pem: export, password: nil))
466+
}
467+
468+
func testImportExportSecp256k1PeerID() throws {
469+
let peerID = try PeerID(.Secp256k1)
470+
let export = try peerID.exportKeyPair(as: .privatePEMString(encryptedWithPassword: "mypassword"))
471+
472+
print(export)
473+
474+
let imported = try PeerID(pem: export, password: "mypassword")
475+
476+
XCTAssertNotNil(imported.keyPair)
477+
XCTAssertNotNil(imported.keyPair?.privateKey)
478+
XCTAssertEqual(imported.keyPair?.privateKey?.rawRepresentation, peerID.keyPair?.privateKey?.rawRepresentation)
479+
XCTAssertEqual(imported, peerID)
480+
481+
/// Ensure the wrong passwords throw errors
482+
XCTAssertThrowsError(try PeerID(pem: export, password: ""))
483+
XCTAssertThrowsError(try PeerID(pem: export, password: "MyPassword"))
484+
XCTAssertThrowsError(try PeerID(pem: export, password: nil))
485+
}
404486

405487
static var allTests = [
406488
("testGeneratePeerID_Default_Params", testGeneratePeerID_Default_Params),
407489
("testGeneratePeerID_RSA_1024", testGeneratePeerID_RSA_1024),
408-
//("testGeneratePeerID_RSA_2048", testGeneratePeerID_RSA_2048),
490+
("testGeneratePeerID_RSA_2048", testGeneratePeerID_RSA_2048),
409491
//("testGeneratePeerID_RSA_3072", testGeneratePeerID_RSA_3072),
410492
//("testGeneratePeerID_RSA_4096", testGeneratePeerID_RSA_4096),
411493
("testGenerate_Secp256k1_PeerID", testGenerate_Secp256k1_PeerID),
@@ -421,8 +503,11 @@ final class PeerIDTests: XCTestCase {
421503
("testFromMarshaledPublicKey", testFromMarshaledPublicKey),
422504
("testFromMarshaledPrivateKey", testFromMarshaledPrivateKey),
423505
("testFromMarshaledPrivateKey_GO", testFromMarshaledPrivateKey_GO),
424-
//("testFromMarshaledPrivateKey_GO_2", testFromMarshaledPrivateKey_GO_2),
506+
("testFromMarshaledPrivateKey_GO_2", testFromMarshaledPrivateKey_GO_2),
425507
("testToJSONPublic", testToJSONPublic),
426-
//("testToJSONFull", testToJSONFull)
508+
("testToJSONFull", testToJSONFull),
509+
("testImportExportEncryptedPEM", testImportExportEncryptedPEM),
510+
("testImportExportED25519PeerID", testImportExportED25519PeerID),
511+
("testImportExportSecp256k1PeerID", testImportExportSecp256k1PeerID),
427512
]
428513
}

0 commit comments

Comments
 (0)