74 lines
2.5 KiB
Swift
74 lines
2.5 KiB
Swift
|
|
import CryptoKit
|
||
|
|
import XCTest
|
||
|
|
@testable import ClipBored
|
||
|
|
|
||
|
|
final class ClipboardEncryptionServiceTests: XCTestCase {
|
||
|
|
func testProtectAndUnprotectRoundTrip() throws {
|
||
|
|
let service = makeService(byte: 7)
|
||
|
|
let value = "secret clipboard value \(UUID().uuidString)"
|
||
|
|
|
||
|
|
let protected = try XCTUnwrap(service.protect(value))
|
||
|
|
|
||
|
|
XCTAssertTrue(ClipboardEncryptionService.isProtected(protected))
|
||
|
|
XCTAssertFalse(protected.contains(value))
|
||
|
|
XCTAssertEqual(service.unprotect(protected), value)
|
||
|
|
}
|
||
|
|
|
||
|
|
func testUnprotectLeavesPlaintextValuesUntouched() {
|
||
|
|
let service = makeService(byte: 7)
|
||
|
|
let value = "plain clipboard value"
|
||
|
|
|
||
|
|
XCTAssertEqual(service.unprotect(value), value)
|
||
|
|
}
|
||
|
|
|
||
|
|
func testMarkerLookingPlaintextIsStillEncryptable() throws {
|
||
|
|
let service = makeService(byte: 7)
|
||
|
|
let value = ClipboardEncryptionService.marker + "not encrypted user text"
|
||
|
|
|
||
|
|
let protected = try XCTUnwrap(service.protect(value))
|
||
|
|
|
||
|
|
XCTAssertNotEqual(protected, value)
|
||
|
|
XCTAssertEqual(service.unprotect(protected), value)
|
||
|
|
XCTAssertEqual(service.unprotect(value), value)
|
||
|
|
}
|
||
|
|
|
||
|
|
func testWrongKeyCannotDecryptProtectedValue() throws {
|
||
|
|
let service = makeService(byte: 7)
|
||
|
|
let wrongService = makeService(byte: 9)
|
||
|
|
let protected = try XCTUnwrap(service.protect("keyed secret"))
|
||
|
|
|
||
|
|
XCTAssertNil(wrongService.unprotect(protected))
|
||
|
|
}
|
||
|
|
|
||
|
|
func testProtectDataAndUnprotectDataRoundTrip() throws {
|
||
|
|
let service = makeService(byte: 7)
|
||
|
|
let data = Data((0..<128).map { UInt8($0) })
|
||
|
|
|
||
|
|
let protected = service.protectData(data)
|
||
|
|
|
||
|
|
XCTAssertTrue(ClipboardEncryptionService.isProtected(protected))
|
||
|
|
XCTAssertNotEqual(protected, data)
|
||
|
|
XCTAssertEqual(service.unprotectData(protected), data)
|
||
|
|
}
|
||
|
|
|
||
|
|
func testWrongKeyCannotDecryptProtectedData() {
|
||
|
|
let service = makeService(byte: 7)
|
||
|
|
let wrongService = makeService(byte: 9)
|
||
|
|
let protected = service.protectData(Data("binary secret".utf8))
|
||
|
|
|
||
|
|
XCTAssertNil(wrongService.unprotectData(protected))
|
||
|
|
}
|
||
|
|
|
||
|
|
func testProtectFallsBackToPlaintextWhenKeyIsUnavailable() {
|
||
|
|
let service = ClipboardEncryptionService(keyProvider: { nil })
|
||
|
|
|
||
|
|
XCTAssertEqual(service.protect("available only in memory"), "available only in memory")
|
||
|
|
XCTAssertEqual(service.protectData(Data("available only in memory".utf8)), Data("available only in memory".utf8))
|
||
|
|
}
|
||
|
|
|
||
|
|
private func makeService(byte: UInt8) -> ClipboardEncryptionService {
|
||
|
|
let keyData = Data(repeating: byte, count: 32)
|
||
|
|
return ClipboardEncryptionService(keyProvider: { SymmetricKey(data: keyData) })
|
||
|
|
}
|
||
|
|
}
|