Bläddra i källkod

Add package tests

maxep 5 år sedan
förälder
incheckning
40cdc59baa

+ 1 - 0
.gitignore

@@ -3,3 +3,4 @@
 /Packages
 /*.xcodeproj
 xcuserdata/
+.swiftpm

+ 15 - 5
Package.swift

@@ -1,11 +1,11 @@
-// swift-tools-version:5.1
+// swift-tools-version:5.3
 // The swift-tools-version declares the minimum version of Swift required to build this package.
 
 import PackageDescription
 
 let package = Package(
     name: "KeePass",
-    platforms: [.iOS(.v13), .macOS(.v10_12)],
+    platforms: [.iOS(.v13), .macOS(.v10_15)],
 
     products: [
         // The `Binary` manipulate bytes with ease.
@@ -31,6 +31,10 @@ let package = Package(
             dependencies: [ "Binary",
                             "KDB",
                             "KDBX"]),
+        .testTarget(
+            name: "KeePassTests",
+            dependencies: ["KeePass"],
+            resources: [ .process("Fixtures") ]),
 
         .target(
             name: "KDB",
@@ -57,20 +61,25 @@ let package = Package(
                             "Sodium", 
                             "Argon2", 
                             "Twofish"]),
+        .testTarget(
+            name: "CryptoTests",
+            dependencies: ["Crypto"]),
 
         .target(
             name: "Gzip",
-            dependencies: ["Binary"]),
+            dependencies: ["Binary"],
+            exclude: ["LICENSE"]),
 
         .target(
             name: "XML",
             dependencies: []),
 
-        // MARK: KeePass cryptographic libraries
+        // MARK: KeePass Cryptographic Libraries
 
         .target(
             name: "Sodium",
             dependencies: [],
+            exclude: ["LICENSE"],
             cSettings: [
                 .headerSearchPath("include/sodium"),
                 .define("CONFIGURED")
@@ -78,7 +87,8 @@ let package = Package(
 
         .target(
             name: "Argon2",
-            dependencies: []),
+            dependencies: [],
+            exclude: ["LICENSE"]),
 
         .target(
             name: "Twofish",

BIN
Tests/KeePassTests/Fixtures/Argon2-kdf-chacha-cipher.kdbx


+ 1 - 0
Tests/KeePassTests/Fixtures/KDB1-hex-key.key

@@ -0,0 +1 @@
+d7cba0e0011e29c79fc8b11b9919a0b0434ae55f265d41add00792af658daae2

BIN
Tests/KeePassTests/Fixtures/KDB1-keePassx.kdb


BIN
Tests/KeePassTests/Fixtures/KDB1-native.kdb


BIN
Tests/KeePassTests/Fixtures/argon2-kdf-AES-cipher.kdbx


+ 180 - 0
Tests/KeePassTests/Fixtures/autotype-custom-keystroke-sequence-1234.xml

@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<KeePassFile>
+	<Meta>
+		<Generator>KeePass</Generator>
+		<DatabaseName />
+		<DatabaseNameChanged>2016-08-15T10:40:25Z</DatabaseNameChanged>
+		<DatabaseDescription />
+		<DatabaseDescriptionChanged>2016-08-15T10:40:25Z</DatabaseDescriptionChanged>
+		<DefaultUserName />
+		<DefaultUserNameChanged>2016-08-15T10:40:25Z</DefaultUserNameChanged>
+		<MaintenanceHistoryDays>365</MaintenanceHistoryDays>
+		<Color />
+		<MasterKeyChanged>2016-08-15T10:40:25Z</MasterKeyChanged>
+		<MasterKeyChangeRec>-1</MasterKeyChangeRec>
+		<MasterKeyChangeForce>-1</MasterKeyChangeForce>
+		<MemoryProtection>
+			<ProtectTitle>False</ProtectTitle>
+			<ProtectUserName>False</ProtectUserName>
+			<ProtectPassword>True</ProtectPassword>
+			<ProtectURL>False</ProtectURL>
+			<ProtectNotes>False</ProtectNotes>
+		</MemoryProtection>
+		<RecycleBinEnabled>True</RecycleBinEnabled>
+		<RecycleBinUUID>XLvTBB6CNki4wm70FSlqmw==</RecycleBinUUID>
+		<RecycleBinChanged>2016-08-15T10:40:25Z</RecycleBinChanged>
+		<EntryTemplatesGroup>AAAAAAAAAAAAAAAAAAAAAA==</EntryTemplatesGroup>
+		<EntryTemplatesGroupChanged>2016-08-15T10:40:25Z</EntryTemplatesGroupChanged>
+		<HistoryMaxItems>10</HistoryMaxItems>
+		<HistoryMaxSize>6291456</HistoryMaxSize>
+		<LastSelectedGroup>gICRKPD/l0uUnBFW3uMwGQ==</LastSelectedGroup>
+		<LastTopVisibleGroup>gICRKPD/l0uUnBFW3uMwGQ==</LastTopVisibleGroup>
+		<Binaries />
+		<CustomData />
+	</Meta>
+	<Root>
+		<Group>
+			<UUID>gICRKPD/l0uUnBFW3uMwGQ==</UUID>
+			<Name>overrideUrl</Name>
+			<Notes />
+			<IconID>49</IconID>
+			<Times>
+				<CreationTime>2016-08-15T10:40:25Z</CreationTime>
+				<LastModificationTime>2016-08-15T10:40:25Z</LastModificationTime>
+				<LastAccessTime>2016-08-15T10:41:13Z</LastAccessTime>
+				<ExpiryTime>2016-08-15T10:39:43Z</ExpiryTime>
+				<Expires>False</Expires>
+				<UsageCount>20</UsageCount>
+				<LocationChanged>2016-08-15T10:40:25Z</LocationChanged>
+			</Times>
+			<IsExpanded>True</IsExpanded>
+			<DefaultAutoTypeSequence />
+			<EnableAutoType>null</EnableAutoType>
+			<EnableSearching>null</EnableSearching>
+			<LastTopVisibleEntry>v+/qEv5xf0aPSeIoJDLCpw==</LastTopVisibleEntry>
+			<Entry>
+				<UUID>v+/qEv5xf0aPSeIoJDLCpw==</UUID>
+				<IconID>0</IconID>
+				<ForegroundColor />
+				<BackgroundColor />
+				<OverrideURL>myOverride</OverrideURL>
+				<Tags />
+				<Times>
+					<CreationTime>2016-08-15T10:41:14Z</CreationTime>
+					<LastModificationTime>2016-08-15T10:47:08Z</LastModificationTime>
+					<LastAccessTime>2016-08-15T10:47:08Z</LastAccessTime>
+					<ExpiryTime>2016-08-15T10:39:43Z</ExpiryTime>
+					<Expires>False</Expires>
+					<UsageCount>2</UsageCount>
+					<LocationChanged>2016-08-15T10:41:14Z</LocationChanged>
+				</Times>
+				<String>
+					<Key>Notes</Key>
+					<Value />
+				</String>
+				<String>
+					<Key>Password</Key>
+					<Value ProtectInMemory="True">psVAkbmCL5cLsF5AN3NP</Value>
+				</String>
+				<String>
+					<Key>Title</Key>
+					<Value>test</Value>
+				</String>
+				<String>
+					<Key>URL</Key>
+					<Value />
+				</String>
+				<String>
+					<Key>UserName</Key>
+					<Value />
+				</String>
+				<AutoType>
+					<Enabled>True</Enabled>
+					<DataTransferObfuscation>0</DataTransferObfuscation>
+					<DefaultSequence>{Title}{Title}{Title}</DefaultSequence>
+				</AutoType>
+				<History>
+					<Entry>
+						<UUID>v+/qEv5xf0aPSeIoJDLCpw==</UUID>
+						<IconID>0</IconID>
+						<ForegroundColor />
+						<BackgroundColor />
+						<OverrideURL>myOverride</OverrideURL>
+						<Tags />
+						<Times>
+							<CreationTime>2016-08-15T10:41:14Z</CreationTime>
+							<LastModificationTime>2016-08-15T10:41:39Z</LastModificationTime>
+							<LastAccessTime>2016-08-15T10:41:39Z</LastAccessTime>
+							<ExpiryTime>2016-08-15T10:39:43Z</ExpiryTime>
+							<Expires>False</Expires>
+							<UsageCount>1</UsageCount>
+							<LocationChanged>2016-08-15T10:41:14Z</LocationChanged>
+						</Times>
+						<String>
+							<Key>Notes</Key>
+							<Value />
+						</String>
+						<String>
+							<Key>Password</Key>
+							<Value ProtectInMemory="True">psVAkbmCL5cLsF5AN3NP</Value>
+						</String>
+						<String>
+							<Key>Title</Key>
+							<Value>test</Value>
+						</String>
+						<String>
+							<Key>URL</Key>
+							<Value />
+						</String>
+						<String>
+							<Key>UserName</Key>
+							<Value />
+						</String>
+						<AutoType>
+							<Enabled>True</Enabled>
+							<DataTransferObfuscation>0</DataTransferObfuscation>
+						</AutoType>
+					</Entry>
+				</History>
+			</Entry>
+		</Group>
+		<DeletedObjects>
+			<DeletedObject>
+				<UUID>uCaZLU8ezEibmKh9c4r3gA==</UUID>
+				<DeletionTime>2016-08-15T10:41:03Z</DeletionTime>
+			</DeletedObject>
+			<DeletedObject>
+				<UUID>/QXzjcOTz0WUxj3VrezEwA==</UUID>
+				<DeletionTime>2016-08-15T10:41:03Z</DeletionTime>
+			</DeletedObject>
+			<DeletedObject>
+				<UUID>xwnFKbp/OEeMi2EQEQ+KwQ==</UUID>
+				<DeletionTime>2016-08-15T10:41:03Z</DeletionTime>
+			</DeletedObject>
+			<DeletedObject>
+				<UUID>kDj8ilWL9EaJIGkyomzofw==</UUID>
+				<DeletionTime>2016-08-15T10:41:03Z</DeletionTime>
+			</DeletedObject>
+			<DeletedObject>
+				<UUID>7MPpowvfWU2ZogypPc2PRg==</UUID>
+				<DeletionTime>2016-08-15T10:41:03Z</DeletionTime>
+			</DeletedObject>
+			<DeletedObject>
+				<UUID>sKdxd5VAm02VQ45andianw==</UUID>
+				<DeletionTime>2016-08-15T10:41:03Z</DeletionTime>
+			</DeletedObject>
+			<DeletedObject>
+				<UUID>7kmlz5vMpEKqRafcO9nYCw==</UUID>
+				<DeletionTime>2016-08-15T10:41:03Z</DeletionTime>
+			</DeletedObject>
+			<DeletedObject>
+				<UUID>feFTnDdGcUqyV4wvReaVJw==</UUID>
+				<DeletionTime>2016-08-15T10:41:03Z</DeletionTime>
+			</DeletedObject>
+			<DeletedObject>
+				<UUID>XLvTBB6CNki4wm70FSlqmw==</UUID>
+				<DeletionTime>2016-08-15T10:41:08Z</DeletionTime>
+			</DeletedObject>
+		</DeletedObjects>
+	</Root>
+</KeePassFile>

BIN
Tests/KeePassTests/Fixtures/autotype.kdbx


BIN
Tests/KeePassTests/Fixtures/binary-attachments.kdbx


BIN
Tests/KeePassTests/Fixtures/broken-binary-attachments.kdbx


BIN
Tests/KeePassTests/Fixtures/custom-icon-password-1234.kdbx


+ 150 - 0
Tests/KeePassTests/Fixtures/custom-icon-password-1234.xml

@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<KeePassFile>
+	<Meta>
+		<Generator>KeePassX</Generator>
+		<DatabaseName/>
+		<DatabaseNameChanged>2013-07-15T19:35:54Z</DatabaseNameChanged>
+		<DatabaseDescription/>
+		<DatabaseDescriptionChanged>2013-07-15T19:35:54Z</DatabaseDescriptionChanged>
+		<DefaultUserName/>
+		<DefaultUserNameChanged>2013-07-15T19:35:54Z</DefaultUserNameChanged>
+		<MaintenanceHistoryDays>365</MaintenanceHistoryDays>
+		<Color/>
+		<MasterKeyChanged>2013-07-15T19:36:02Z</MasterKeyChanged>
+		<MasterKeyChangeRec>-1</MasterKeyChangeRec>
+		<MasterKeyChangeForce>-1</MasterKeyChangeForce>
+		<MemoryProtection>
+			<ProtectTitle>False</ProtectTitle>
+			<ProtectUserName>False</ProtectUserName>
+			<ProtectPassword>True</ProtectPassword>
+			<ProtectURL>False</ProtectURL>
+			<ProtectNotes>False</ProtectNotes>
+		</MemoryProtection>
+		<CustomIcons>
+			<Icon>
+				<UUID>RaP8u/B18ngIutqc2B5c9g==</UUID>
+				<Data>iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAsSAAALEgHS3X78AAACHUlEQVQokV2SzUtUYRTGn/Pe915HZyIwJ0FDEsqCXORGaBFYLWoR7foDglZt+xuCFu76G9q0iFBKMgQhhUhIhIRM7EuHq+N8ODN37uf7ntNCR249q7P4wfOccx4SEfRkwY4oEIyVNAoLJVdZTxxD0KeMQk4OKxCSKF5893KgJEkkcAyJzjOQnJiZRSp7P01rh4Ot+devjFjLeUT+cQCJyez3zRVH2sTd+/euB60O0T+IEjAACAAWIwfNg5lrZ5HWkNZxtL24NEcCgCEnVM+BACjlYG9jFU5HzCFnR+Duw1vjQdTpAUyAolyqSqU2PbGPqLrwYXf+/VdYH40vywtz1vZiCTR6s8mi0eK21Npg7NZ9sQWElLC+MymNuj9UHiFSICgc7wA0age8u0CpWLt/6VzxwlCfZK2+NHTT/eWltxADAGB9vEoUhmVnh6KqQb+WdPpKod6o0e+P1loNmSmO+od3R86PQZQGFEm2tbU+5c9K/Ed321BUGrx4Rg1mnZZrGZbKvPFpfW749iPxigowzSCbLG2nvzak6SPu2m61k4zFXHQ7KQIgDhAXJiovmkGsJaHM8I+11YmVm/CAzAOlrPHm21U/bD2ZqoIsGcWKlcHm5dnxB08pC41ee24/P3NsZPVJbYgoX8rjF7e5nDze0bFSCjoZvmGUUr2LAaAcnyrX4ywxxX6XiVkobTbR77H5r7yncjnp6tIA2z6v8BeUfknGrtTw7gAAAABJRU5ErkJggg==</Data>
+			</Icon>
+		</CustomIcons>
+		<RecycleBinEnabled>True</RecycleBinEnabled>
+		<RecycleBinUUID>AAAAAAAAAAAAAAAAAAAAAA==</RecycleBinUUID>
+		<RecycleBinChanged>2013-07-15T19:35:54Z</RecycleBinChanged>
+		<EntryTemplatesGroup>AAAAAAAAAAAAAAAAAAAAAA==</EntryTemplatesGroup>
+		<EntryTemplatesGroupChanged>2013-07-15T19:35:54Z</EntryTemplatesGroupChanged>
+		<HistoryMaxItems>10</HistoryMaxItems>
+		<HistoryMaxSize>6291456</HistoryMaxSize>
+		<LastSelectedGroup>AAAAAAAAAAAAAAAAAAAAAA==</LastSelectedGroup>
+		<LastTopVisibleGroup>AAAAAAAAAAAAAAAAAAAAAA==</LastTopVisibleGroup>
+		<Binaries/>
+		<CustomData/>
+	</Meta>
+	<Root>
+		<Group>
+			<UUID>8XPXLHyIoM9KLqrjDHjsZQ==</UUID>
+			<Name>Root</Name>
+			<Notes/>
+			<IconID>48</IconID>
+			<Times>
+				<LastModificationTime>2013-07-15T19:35:54Z</LastModificationTime>
+				<CreationTime>2013-07-15T19:35:54Z</CreationTime>
+				<LastAccessTime>2013-07-15T19:35:54Z</LastAccessTime>
+				<ExpiryTime>2013-07-15T19:35:54Z</ExpiryTime>
+				<Expires>False</Expires>
+				<UsageCount>0</UsageCount>
+				<LocationChanged>2013-07-15T19:35:54Z</LocationChanged>
+			</Times>
+			<IsExpanded>True</IsExpanded>
+			<DefaultAutoTypeSequence/>
+			<EnableAutoType>null</EnableAutoType>
+			<EnableSearching>null</EnableSearching>
+			<LastTopVisibleEntry>AAAAAAAAAAAAAAAAAAAAAA==</LastTopVisibleEntry>
+			<Entry>
+				<UUID>XW1C9XAjxqVKt4bJsOpgRQ==</UUID>
+				<IconID>0</IconID>
+				<CustomIconUUID>RaP8u/B18ngIutqc2B5c9g==</CustomIconUUID>
+				<ForegroundColor/>
+				<BackgroundColor/>
+				<OverrideURL/>
+				<Tags/>
+				<Times>
+					<LastModificationTime>2013-07-15T19:37:38Z</LastModificationTime>
+					<CreationTime>2013-07-15T19:36:04Z</CreationTime>
+					<LastAccessTime>2013-07-15T19:37:38Z</LastAccessTime>
+					<ExpiryTime>2013-07-15T19:36:04Z</ExpiryTime>
+					<Expires>False</Expires>
+					<UsageCount>0</UsageCount>
+					<LocationChanged>2013-07-15T19:36:08Z</LocationChanged>
+				</Times>
+				<String>
+					<Key>Title</Key>
+					<Value>CustomIcon</Value>
+				</String>
+				<String>
+					<Key>UserName</Key>
+					<Value/>
+				</String>
+				<String>
+					<Key>Password</Key>
+					<Value Protected="True"/>
+				</String>
+				<String>
+					<Key>URL</Key>
+					<Value/>
+				</String>
+				<String>
+					<Key>Notes</Key>
+					<Value/>
+				</String>
+				<AutoType>
+					<Enabled>True</Enabled>
+					<DataTransferObfuscation>0</DataTransferObfuscation>
+					<DefaultSequence/>
+				</AutoType>
+				<History>
+					<Entry>
+						<UUID>XW1C9XAjxqVKt4bJsOpgRQ==</UUID>
+						<IconID>0</IconID>
+						<ForegroundColor/>
+						<BackgroundColor/>
+						<OverrideURL/>
+						<Tags/>
+						<Times>
+							<LastModificationTime>2013-07-15T19:36:08Z</LastModificationTime>
+							<CreationTime>2013-07-15T19:36:04Z</CreationTime>
+							<LastAccessTime>2013-07-15T19:36:08Z</LastAccessTime>
+							<ExpiryTime>2013-07-15T19:36:04Z</ExpiryTime>
+							<Expires>False</Expires>
+							<UsageCount>0</UsageCount>
+							<LocationChanged>2013-07-15T19:36:08Z</LocationChanged>
+						</Times>
+						<String>
+							<Key>Title</Key>
+							<Value>CustomIcon</Value>
+						</String>
+						<String>
+							<Key>UserName</Key>
+							<Value/>
+						</String>
+						<String>
+							<Key>Password</Key>
+							<Value Protected="True"/>
+						</String>
+						<String>
+							<Key>URL</Key>
+							<Value/>
+						</String>
+						<String>
+							<Key>Notes</Key>
+							<Value/>
+						</String>
+						<AutoType>
+							<Enabled>True</Enabled>
+							<DataTransferObfuscation>0</DataTransferObfuscation>
+							<DefaultSequence/>
+						</AutoType>
+					</Entry>
+				</History>
+			</Entry>
+		</Group>
+	</Root>
+</KeePassFile>

BIN
Tests/KeePassTests/Fixtures/error-duplicate-attachments-1234.kdbx


+ 9 - 0
Tests/KeePassTests/Fixtures/keepass2-key.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<KeyFile>
+	<Meta>
+		<Version>1.00</Version>
+	</Meta>
+	<Key>
+		<Data>L8JyIjlAd3SowrQPm6ZaR9mMolm/7iL6T1GJRGBNrAE=</Data>
+	</Key>
+</KeyFile>

BIN
Tests/KeePassTests/Fixtures/no-password-KDB1-hex-key-key-file.kdb


BIN
Tests/KeePassTests/Fixtures/no-password-KDBX-hex-key-key-file.kdbx


+ 0 - 0
Fixtures/password-five-entries-ladder.xml → Tests/KeePassTests/Fixtures/password-five-entries-ladder.xml


BIN
Tests/KeePassTests/Fixtures/strongbox.kdbx


BIN
Tests/KeePassTests/Fixtures/test-password-1234.kdb


BIN
Tests/KeePassTests/Fixtures/test-password-1234.kdbx


BIN
Tests/KeePassTests/Fixtures/twofish-cipher-256bit.kdb


BIN
Tests/KeePassTests/Fixtures/twofish-cipher-256bit.kdbx


+ 17 - 2
Tests/KeePassTests/KeePassTests.swift

@@ -3,11 +3,26 @@ import XCTest
 
 final class KeePassTests: XCTestCase {
 
-    func testExample() {
+    func testKDBX3() throws {
+        let file = Bundle.module.url(forResource: "test-password-1234", withExtension: "kdbx")!
 
+        let key = CompositeKey(password: "1234")
+
+        let db = try KeePass.open(contentOf: file, compositeKey: key)
+        print(db)
+    }
+
+    func testKDBX4() throws {
+        let file = Bundle.module.url(forResource: "argon2-kdf-AES-cipher", withExtension: "kdbx")!
+
+        let key = CompositeKey(password: "test")
+
+        let db = try KeePass.open(contentOf: file, compositeKey: key)
+        print(db)
     }
 
     static var allTests = [
-        ("testExample", testExample),
+        ("testKDBX3", testKDBX3),
+        ("testKDBX4", testKDBX4),
     ]
 }