@@ -274,7 +274,6 @@ final class PeerIDTests: XCTestCase {
274
274
}
275
275
276
276
func testFromMarshaledPrivateKey( ) throws {
277
-
278
277
let marshaledPeerIDData = Data ( hex: PeerIDTests . samplePeerID. marshaled) //try Multihash(hexString: "f\(PeerIDTests.samplePeerID.marshaled)").value
279
278
let protoPeerID = try PeerIdProto ( contiguousBytes: marshaledPeerIDData)
280
279
@@ -304,7 +303,6 @@ final class PeerIDTests: XCTestCase {
304
303
/// Imports a SecKey from the raw data
305
304
/// Extracts/derives a Public Key from the Private Key
306
305
func testFromMarshaledPrivateKey_GO( ) throws {
307
-
308
306
let marshaledPrivateKey = try BaseEncoding . decode ( PeerIDTests . goPeerID. privKey, as: . base64Pad)
309
307
310
308
let peerID = try PeerID ( marshaledPrivateKey: marshaledPrivateKey. data)
@@ -316,10 +314,8 @@ final class PeerIDTests: XCTestCase {
316
314
XCTAssertEqual ( pid, PeerIDTests . goPeerID. id)
317
315
}
318
316
319
- /// Marshaling Private RSA Keys aren't supported yet on Linux
320
- #if canImport(Security)
317
+ /// Marshaling Private RSA Keys
321
318
func testFromMarshaledPrivateKey_GO_2( ) throws {
322
-
323
319
let peerID = try PeerID ( marshaledPrivateKey: PeerIDTests . goPeerID. privKey, base: . base64Pad)
324
320
325
321
XCTAssertEqual ( peerID. b58String, PeerIDTests . goPeerID. id)
@@ -332,13 +328,9 @@ final class PeerIDTests: XCTestCase {
332
328
333
329
XCTAssertEqual ( marshaledPrivKey. asString ( base: . base64Pad) , PeerIDTests . goPeerID. privKey)
334
330
}
335
- #endif
336
331
337
- /// 3.052, 3.096 (using multibase library)
338
- /// 0.135, 0.134 (using Data(hex: ))
339
332
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)
342
334
343
335
let publicJSON = try peerID. toJSON ( includingPrivateKey: false )
344
336
@@ -357,10 +349,8 @@ final class PeerIDTests: XCTestCase {
357
349
XCTAssertNil ( pubID. keyPair? . privateKey)
358
350
}
359
351
360
- #if canImport(Security)
361
352
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)
364
354
365
355
let fullJSON = try peerID. toJSON ( includingPrivateKey: true )
366
356
let publicJSON = try peerID. toJSON ( includingPrivateKey: false )
@@ -400,12 +390,104 @@ final class PeerIDTests: XCTestCase {
400
390
XCTAssertEqual ( pubID. keyPair? . publicKey. asString ( base: . base64) , fullID. keyPair? . publicKey. asString ( base: . base64) )
401
391
XCTAssertNotEqual ( pubID. keyPair? . privateKey? . asString ( base: . base64) , fullID. keyPair? . privateKey? . asString ( base: . base64) )
402
392
}
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
+ }
404
486
405
487
static var allTests = [
406
488
( " testGeneratePeerID_Default_Params " , testGeneratePeerID_Default_Params) ,
407
489
( " testGeneratePeerID_RSA_1024 " , testGeneratePeerID_RSA_1024) ,
408
- // ("testGeneratePeerID_RSA_2048", testGeneratePeerID_RSA_2048),
490
+ ( " testGeneratePeerID_RSA_2048 " , testGeneratePeerID_RSA_2048) ,
409
491
//("testGeneratePeerID_RSA_3072", testGeneratePeerID_RSA_3072),
410
492
//("testGeneratePeerID_RSA_4096", testGeneratePeerID_RSA_4096),
411
493
( " testGenerate_Secp256k1_PeerID " , testGenerate_Secp256k1_PeerID) ,
@@ -421,8 +503,11 @@ final class PeerIDTests: XCTestCase {
421
503
( " testFromMarshaledPublicKey " , testFromMarshaledPublicKey) ,
422
504
( " testFromMarshaledPrivateKey " , testFromMarshaledPrivateKey) ,
423
505
( " testFromMarshaledPrivateKey_GO " , testFromMarshaledPrivateKey_GO) ,
424
- // ("testFromMarshaledPrivateKey_GO_2", testFromMarshaledPrivateKey_GO_2),
506
+ ( " testFromMarshaledPrivateKey_GO_2 " , testFromMarshaledPrivateKey_GO_2) ,
425
507
( " testToJSONPublic " , testToJSONPublic) ,
426
- //("testToJSONFull", testToJSONFull)
508
+ ( " testToJSONFull " , testToJSONFull) ,
509
+ ( " testImportExportEncryptedPEM " , testImportExportEncryptedPEM) ,
510
+ ( " testImportExportED25519PeerID " , testImportExportED25519PeerID) ,
511
+ ( " testImportExportSecp256k1PeerID " , testImportExportSecp256k1PeerID) ,
427
512
]
428
513
}
0 commit comments