From 17aa683ffd3d5dcddffe35c90338bd324f7e3f2c Mon Sep 17 00:00:00 2001 From: Shibo Lyu Date: Tue, 22 Apr 2025 19:22:45 +0800 Subject: [PATCH 1/7] Add Sendable conformance to Minisign types. --- Package@swift-5.8.swift | 0 Sources/Minisign/Minisign.swift | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 Package@swift-5.8.swift diff --git a/Package@swift-5.8.swift b/Package@swift-5.8.swift new file mode 100644 index 0000000..e69de29 diff --git a/Sources/Minisign/Minisign.swift b/Sources/Minisign/Minisign.swift index 31bca54..4093222 100644 --- a/Sources/Minisign/Minisign.swift +++ b/Sources/Minisign/Minisign.swift @@ -11,7 +11,7 @@ import Foundation import CryptoKit #endif -public enum SignatureAlgorithm: RawRepresentable { +public enum SignatureAlgorithm: Sendable, RawRepresentable { case pureEdDSA case hashedEdDSA @@ -39,7 +39,7 @@ public enum SignatureAlgorithm: RawRepresentable { private let untrustedCommentHeader = "untrusted comment: ".data(using: .utf8)! private let trustedCommentHeader = "trusted comment: ".data(using: .utf8)! -public struct PublicKey { +public struct PublicKey: Sendable { public let untrustedComment: String public let signatureAlgorithm: SignatureAlgorithm public let keyID: Data @@ -115,7 +115,7 @@ public struct PublicKey { } } -public struct Signature { +public struct Signature: Sendable { public let untrustedComment: String public let signatureAlgorithm: SignatureAlgorithm public let keyID: Data From 2248fe8c01e565cdf094111989385a64c66d6f97 Mon Sep 17 00:00:00 2001 From: Shibo Lyu Date: Tue, 22 Apr 2025 19:24:19 +0800 Subject: [PATCH 2/7] Add Swift 5.8+ package configuration for backward compatibility with old toolchains --- Package@swift-5.8.swift | 44 +++++++++++++++++++++++++++++++++++++++++ README.md | 1 + 2 files changed, 45 insertions(+) diff --git a/Package@swift-5.8.swift b/Package@swift-5.8.swift index e69de29..a56c119 100644 --- a/Package@swift-5.8.swift +++ b/Package@swift-5.8.swift @@ -0,0 +1,44 @@ +// swift-tools-version: 5.8 + +import PackageDescription + +let package = Package( + name: "Minisign", + platforms: [ + .macOS(.v10_15), + .iOS(.v13), + .visionOS(.v1), + .tvOS(.v13), + .watchOS(.v6), + ], + products: [ + // Products define the executables and libraries a package produces, making them visible to other packages. + .library( + name: "Minisign", + targets: ["Minisign"] + ) + ], + dependencies: [ + .package(url: "https://github.com/apple/swift-crypto", from: "2.0.0"), + .package(url: "https://github.com/lovetodream/swift-blake2", from: "0.1.0"), + ], + targets: [ + // Targets are the basic building blocks of a package, defining a module or a test suite. + // Targets can depend on other targets in this package and products from dependencies. + .target( + name: "Minisign", + dependencies: [ + .product(name: "Crypto", package: "swift-crypto"), + .product(name: "BLAKE2", package: "swift-blake2"), + ], + swiftSettings: [ + .define("UseSwiftCrypto") + ] + ), + .testTarget( + name: "MinisignTests", + dependencies: ["Minisign"] + ), + ], + swiftLanguageModes: [.version("6"), .v5], +) diff --git a/README.md b/README.md index 5a22615..4504a90 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ Swift implementation of Minisign, a simple and secure tool for signing and verif This is a fork of [slarew/swift-minisign](https://github.com/slarew/swift-minisign), with these improvements: - Convenient & efficient API for verifying (big) files +- `Sendable` conformance & full Swift 6 support - Replaced C wrapping `swift-crypto-blake2` with [pure Swift implementation of blake2b](https://github.com/lovetodream/swift-blake2). - For Apple platforms, Swift Crypto dependency is now optional, controllable via trait `UseSwiftCrypto`. From 1a762651b6cd016b6bd6dd4f03589a3e112d3bd8 Mon Sep 17 00:00:00 2001 From: Shibo Lyu Date: Wed, 23 Apr 2025 11:00:33 +0800 Subject: [PATCH 3/7] fix: supported platforms --- Package.swift | 3 +-- Package@swift-5.8.swift | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Package.swift b/Package.swift index be13759..9c0c629 100644 --- a/Package.swift +++ b/Package.swift @@ -8,9 +8,8 @@ let package = Package( platforms: [ .macOS(.v10_15), .iOS(.v13), - .visionOS(.v1), + .watchOS(.v6), .tvOS(.v13), - .watchOS(.v6) ], products: [ // Products define the executables and libraries a package produces, making them visible to other packages. diff --git a/Package@swift-5.8.swift b/Package@swift-5.8.swift index a56c119..8e4cec8 100644 --- a/Package@swift-5.8.swift +++ b/Package@swift-5.8.swift @@ -7,9 +7,8 @@ let package = Package( platforms: [ .macOS(.v10_15), .iOS(.v13), - .visionOS(.v1), - .tvOS(.v13), .watchOS(.v6), + .tvOS(.v13), ], products: [ // Products define the executables and libraries a package produces, making them visible to other packages. From e10a2449c85ad6ea85b9f03570055cd73ce7caae Mon Sep 17 00:00:00 2001 From: Shibo Lyu Date: Wed, 23 Apr 2025 16:18:30 +0800 Subject: [PATCH 4/7] fix: SwiftPM language versions property name --- Package@swift-5.8.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package@swift-5.8.swift b/Package@swift-5.8.swift index 8e4cec8..46b4194 100644 --- a/Package@swift-5.8.swift +++ b/Package@swift-5.8.swift @@ -39,5 +39,5 @@ let package = Package( dependencies: ["Minisign"] ), ], - swiftLanguageModes: [.version("6"), .v5], + swiftLanguageVersions: [.version("6"), .v5] ) From d2657b54f3770099cef898fb74a90121eb644f70 Mon Sep 17 00:00:00 2001 From: Shibo Lyu Date: Wed, 23 Apr 2025 16:32:47 +0800 Subject: [PATCH 5/7] feat: Add configurable buffer size for file signature verification --- Sources/Minisign/Minisign.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Sources/Minisign/Minisign.swift b/Sources/Minisign/Minisign.swift index 4093222..bf40538 100644 --- a/Sources/Minisign/Minisign.swift +++ b/Sources/Minisign/Minisign.swift @@ -87,13 +87,12 @@ public struct PublicKey: Sendable { /// /// This method reads the file in chunks to avoid loading the entire file into memory, but does so in a blocking manner. /// It's recommended to use this method in a background thread or task. - public func isValidSignature(_ signature: Signature, forFileAt url: URL) throws -> Bool { + public func isValidSignature(_ signature: Signature, forFileAt url: URL, bufferSize: Int = 8192) throws -> Bool { guard signature.signatureAlgorithm == .hashedEdDSA else { throw SignatureVerifyError.algorithmNotSupportedForFile } var blake2b = try! BLAKE2b() let fileHandle = try FileHandle(forReadingFrom: url) - let bufferSize = 4096 while true { let data = fileHandle.readData(ofLength: bufferSize) if data.isEmpty { break } From c600a12016d6db0dd6413b4ed05d2a14d3c0c4b1 Mon Sep 17 00:00:00 2001 From: Shibo Lyu Date: Wed, 23 Apr 2025 16:35:15 +0800 Subject: [PATCH 6/7] doc: Add Swift Package Index badges to README --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 4504a90..30180f4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # Swift Minisign +[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Flaosb%2Fswift-minisign%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/laosb/swift-minisign) +[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Flaosb%2Fswift-minisign%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/laosb/swift-minisign) + Swift implementation of Minisign, a simple and secure tool for signing and verifying files. This is a fork of [slarew/swift-minisign](https://github.com/slarew/swift-minisign), with these improvements: From 94a251ed0cbfb300cc506628af3e10ace65d7e29 Mon Sep 17 00:00:00 2001 From: Shibo Lyu Date: Thu, 24 Apr 2025 15:25:55 +0800 Subject: [PATCH 7/7] fix: dependencies & concurrency markups --- Package.swift | 5 +++-- Package@swift-5.8.swift => Package@swift-5.9.swift | 4 ++-- Sources/Minisign/Minisign.swift | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) rename Package@swift-5.8.swift => Package@swift-5.9.swift (90%) diff --git a/Package.swift b/Package.swift index 9c0c629..ef7d1be 100644 --- a/Package.swift +++ b/Package.swift @@ -27,7 +27,7 @@ let package = Package( .default(enabledTraits: ["UseSwiftCrypto"]), ], dependencies: [ - .package(url: "https://github.com/apple/swift-crypto", from: "2.0.0"), + .package(url: "https://github.com/apple/swift-crypto", "1.0.0" ..< "4.0.0"), .package(url: "https://github.com/lovetodream/swift-blake2", from: "0.1.0") ], targets: [ @@ -44,5 +44,6 @@ let package = Package( name: "MinisignTests", dependencies: ["Minisign"] ), - ] + ], + swiftLanguageModes: [.v6] ) diff --git a/Package@swift-5.8.swift b/Package@swift-5.9.swift similarity index 90% rename from Package@swift-5.8.swift rename to Package@swift-5.9.swift index 46b4194..33d3fa9 100644 --- a/Package@swift-5.8.swift +++ b/Package@swift-5.9.swift @@ -1,4 +1,4 @@ -// swift-tools-version: 5.8 +// swift-tools-version: 5.9 import PackageDescription @@ -18,7 +18,7 @@ let package = Package( ) ], dependencies: [ - .package(url: "https://github.com/apple/swift-crypto", from: "2.0.0"), + .package(url: "https://github.com/apple/swift-crypto", "1.0.0" ..< "4.0.0"), .package(url: "https://github.com/lovetodream/swift-blake2", from: "0.1.0"), ], targets: [ diff --git a/Sources/Minisign/Minisign.swift b/Sources/Minisign/Minisign.swift index bf40538..ecaa5b4 100644 --- a/Sources/Minisign/Minisign.swift +++ b/Sources/Minisign/Minisign.swift @@ -6,9 +6,9 @@ import BLAKE2 import Foundation #if UseSwiftCrypto - import Crypto + @preconcurrency import Crypto #else - import CryptoKit + @preconcurrency import CryptoKit #endif public enum SignatureAlgorithm: Sendable, RawRepresentable {