Skip to content

Commit 7b3f8cb

Browse files
committed
Fix MachOFile.CodeSign to use FileIO
1 parent 7e2adea commit 7b3f8cb

10 files changed

+133
-175
lines changed

Sources/MachOKit/DyldCache.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -220,11 +220,12 @@ extension DyldCache {
220220

221221
extension DyldCache {
222222
public var codeSign: MachOFile.CodeSign? {
223-
let data = fileHandle.readData(
224-
offset: header.codeSignatureOffset,
225-
size: numericCast(header.codeSignatureSize)
223+
.init(
224+
fileSice: try! fileHandle.fileSlice(
225+
offset: numericCast(header.codeSignatureOffset),
226+
length: numericCast(header.codeSignatureSize)
227+
)
226228
)
227-
return .init(data: data)
228229
}
229230
}
230231

Sources/MachOKit/MachOFile+CodeSign.swift

Lines changed: 60 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -8,91 +8,81 @@
88

99
import CoreFoundation
1010
import Foundation
11+
import FileIO
1112
import MachOKitC
1213

1314
extension MachOFile {
1415
public struct CodeSign {
15-
public let data: Data
16+
public typealias FileSlice = File.FileSlice
17+
18+
public let fileSice: FileSlice
1619
public let isSwapped: Bool // bigEndian => false
1720
}
1821
}
1922

2023
extension MachOFile.CodeSign {
21-
init(data: Data) {
22-
self.data = data
24+
init(fileSice: FileSlice) {
25+
self.fileSice = fileSice
2326
self.isSwapped = CFByteOrderGetCurrent() != CFByteOrderBigEndian.rawValue
2427
}
2528
}
2629

2730
extension MachOFile.CodeSign: CodeSignProtocol {
2831
public var superBlob: CodeSignSuperBlob? {
29-
data.withUnsafeBytes {
30-
guard let basePtr = $0.baseAddress else { return nil }
31-
var layout = basePtr.assumingMemoryBound(to: CS_SuperBlob.self).pointee
32-
if isSwapped { layout = layout.swapped }
33-
return .init(
34-
layout: layout,
35-
offset: 0
36-
)
37-
}
32+
var layout = fileSice.ptr
33+
.assumingMemoryBound(to: CS_SuperBlob.self)
34+
.pointee
35+
if isSwapped { layout = layout.swapped }
36+
return .init(
37+
layout: layout,
38+
offset: 0
39+
)
3840
}
3941

4042
public var codeDirectories: [CodeSignCodeDirectory] {
41-
data.withUnsafeBytes { bufferPointer in
42-
guard let baseAddress = bufferPointer.baseAddress,
43-
let superBlob else {
44-
return []
45-
}
46-
let blobIndices = superBlob.blobIndices(in: self)
47-
return blobIndices
48-
.compactMap {
49-
let offset: Int = numericCast($0.offset)
50-
let ptr = baseAddress.advanced(by: offset)
51-
let _blob = ptr.assumingMemoryBound(to: CS_GenericBlob.self).pointee
52-
let blob = CodeSignGenericBlob(
53-
layout: isSwapped ? _blob.swapped : _blob
54-
)
55-
guard blob.magic == .codedirectory else {
56-
return nil
57-
}
58-
return (
59-
ptr.assumingMemoryBound(to: CS_CodeDirectory.self).pointee,
60-
offset
61-
)
62-
}
63-
.map {
64-
isSwapped ? .init(layout: $0.swapped, offset: $1)
65-
: .init(layout: $0, offset: $1)
43+
guard let superBlob else { return [] }
44+
let blobIndices = superBlob.blobIndices(in: self)
45+
return blobIndices
46+
.compactMap {
47+
let offset: Int = numericCast($0.offset)
48+
let ptr = fileSice.ptr.advanced(by: offset)
49+
let _blob = ptr.assumingMemoryBound(to: CS_GenericBlob.self).pointee
50+
let blob = CodeSignGenericBlob(
51+
layout: isSwapped ? _blob.swapped : _blob
52+
)
53+
guard blob.magic == .codedirectory else {
54+
return nil
6655
}
67-
}
56+
return (
57+
ptr.assumingMemoryBound(to: CS_CodeDirectory.self).pointee,
58+
offset
59+
)
60+
}
61+
.map {
62+
isSwapped ? .init(layout: $0.swapped, offset: $1)
63+
: .init(layout: $0, offset: $1)
64+
}
6865
}
6966

7067
public var requirementsBlob: CodeSignSuperBlob? {
71-
guard let superBlob else {
72-
return nil
73-
}
68+
guard let superBlob else { return nil }
7469
let blobIndices = superBlob.blobIndices(in: self)
7570
guard let index = blobIndices.first(
7671
where: { $0.type == .requirements }
7772
) else {
7873
return nil
7974
}
80-
return data.withUnsafeBytes { bufferPointer in
81-
guard let baseAddress = bufferPointer.baseAddress else {
82-
return nil
83-
}
84-
let offset: Int = numericCast(index.offset)
85-
let ptr = baseAddress.advanced(by: offset)
86-
var _blob = ptr
87-
.assumingMemoryBound(to: CS_SuperBlob.self)
88-
.pointee
89-
if isSwapped { _blob = _blob.swapped }
75+
let offset: Int = numericCast(index.offset)
76+
let ptr = fileSice.ptr.advanced(by: offset)
77+
var _blob = ptr
78+
.assumingMemoryBound(to: CS_SuperBlob.self)
79+
.pointee
80+
if isSwapped { _blob = _blob.swapped }
9081

91-
return .init(
92-
layout: _blob,
93-
offset: offset
94-
)
95-
}
82+
return .init(
83+
layout: _blob,
84+
offset: offset
85+
)
9686
}
9787
}
9888

@@ -110,26 +100,21 @@ extension MachOFile.CodeSign {
110100
at index: CodeSignBlobIndex,
111101
includesGenericInfo: Bool = true
112102
) -> Data? {
113-
data.withUnsafeBytes { bufferPointer in
114-
guard let baseAddress = bufferPointer.baseAddress else {
115-
return nil
116-
}
117-
let offset: Int = numericCast(superBlob.offset) + numericCast(index.offset)
118-
guard let _blob: CodeSignGenericBlob = .load(
119-
from: baseAddress,
120-
offset: offset,
121-
isSwapped: isSwapped
122-
) else { return nil }
103+
let offset: Int = numericCast(superBlob.offset) + numericCast(index.offset)
104+
guard let _blob: CodeSignGenericBlob = .load(
105+
from: fileSice.ptr,
106+
offset: offset,
107+
isSwapped: isSwapped
108+
) else { return nil }
123109

124-
let data = Data(
125-
bytes: baseAddress.advanced(by: offset),
126-
count: numericCast(_blob.length)
127-
)
128-
if includesGenericInfo {
129-
return data
130-
} else {
131-
return data.advanced(by: CodeSignGenericBlob.layoutSize)
132-
}
110+
let data = Data(
111+
bytes: fileSice.ptr.advanced(by: offset),
112+
count: numericCast(_blob.length)
113+
)
114+
if includesGenericInfo {
115+
return data
116+
} else {
117+
return data.advanced(by: CodeSignGenericBlob.layoutSize)
133118
}
134119
}
135120

Sources/MachOKit/MachOFile.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -495,12 +495,12 @@ extension MachOFile {
495495
guard let info = loadCommands.codeSignature else {
496496
return nil
497497
}
498-
let data = fileHandle.readData(
499-
offset: UInt64(headerStartOffset) + numericCast(info.dataoff),
500-
size: numericCast(info.datasize)
498+
return .init(
499+
fileSice: try! fileHandle.fileSlice(
500+
offset: numericCast(headerStartOffset) + numericCast(info.dataoff),
501+
length: numericCast(info.datasize)
502+
)
501503
)
502-
503-
return .init(data: data)
504504
}
505505
}
506506

Sources/MachOKit/Model/Codesign/CodeDirectory/CodeSignCodeDirectory+codeLimit64.swift

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,13 @@ extension CodeSignCodeDirectory {
1313
guard isSupportsCodeLimit64 else {
1414
return nil
1515
}
16-
let layout: CS_CodeDirectory_CodeLimit64? = signature.data.withUnsafeBytes {
17-
guard let baseAddress = $0.baseAddress else {
18-
return nil
19-
}
20-
return baseAddress
21-
.advanced(by: offset)
22-
.advanced(by: layoutSize)
23-
.advanced(by: ScatterOffset.layoutSize)
24-
.advanced(by: TeamIdOffset.layoutSize)
25-
.assumingMemoryBound(to: CS_CodeDirectory_CodeLimit64.self)
26-
.pointee
27-
}
28-
guard let layout else { return nil }
16+
let layout: CS_CodeDirectory_CodeLimit64 = signature.fileSice.ptr
17+
.advanced(by: offset)
18+
.advanced(by: layoutSize)
19+
.advanced(by: ScatterOffset.layoutSize)
20+
.advanced(by: TeamIdOffset.layoutSize)
21+
.assumingMemoryBound(to: CS_CodeDirectory_CodeLimit64.self)
22+
.pointee
2923
return .init(
3024
layout: signature.isSwapped ? layout.swapped : layout
3125
)

Sources/MachOKit/Model/Codesign/CodeDirectory/CodeSignCodeDirectory+executableSegment.swift

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,14 @@ extension CodeSignCodeDirectory {
1313
guard isSupportsExecSegment else {
1414
return nil
1515
}
16-
let layout: CS_CodeDirectory_ExecSeg? = signature.data.withUnsafeBytes {
17-
guard let baseAddress = $0.baseAddress else {
18-
return nil
19-
}
20-
return baseAddress
21-
.advanced(by: offset)
22-
.advanced(by: layoutSize)
23-
.advanced(by: ScatterOffset.layoutSize)
24-
.advanced(by: TeamIdOffset.layoutSize)
25-
.advanced(by: CodeLimit64.layoutSize)
26-
.assumingMemoryBound(to: CS_CodeDirectory_ExecSeg.self)
27-
.pointee
28-
}
29-
guard let layout else { return nil }
16+
let layout: CS_CodeDirectory_ExecSeg = signature.fileSice.ptr
17+
.advanced(by: offset)
18+
.advanced(by: layoutSize)
19+
.advanced(by: ScatterOffset.layoutSize)
20+
.advanced(by: TeamIdOffset.layoutSize)
21+
.advanced(by: CodeLimit64.layoutSize)
22+
.assumingMemoryBound(to: CS_CodeDirectory_ExecSeg.self)
23+
.pointee
3024
return .init(
3125
layout: signature.isSwapped ? layout.swapped : layout
3226
)

Sources/MachOKit/Model/Codesign/CodeDirectory/CodeSignCodeDirectory+runtime.swift

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,15 @@ extension CodeSignCodeDirectory {
1313
guard isSupportsRuntime else {
1414
return nil
1515
}
16-
let layout: CS_CodeDirectory_Runtime? = signature.data.withUnsafeBytes {
17-
guard let baseAddress = $0.baseAddress else {
18-
return nil
19-
}
20-
return baseAddress
21-
.advanced(by: offset)
22-
.advanced(by: layoutSize)
23-
.advanced(by: ScatterOffset.layoutSize)
24-
.advanced(by: TeamIdOffset.layoutSize)
25-
.advanced(by: CodeLimit64.layoutSize)
26-
.advanced(by: ExecutableSegment.layoutSize)
27-
.assumingMemoryBound(to: CS_CodeDirectory_Runtime.self)
28-
.pointee
29-
}
30-
guard let layout else { return nil }
16+
let layout: CS_CodeDirectory_Runtime = signature.fileSice.ptr
17+
.advanced(by: offset)
18+
.advanced(by: layoutSize)
19+
.advanced(by: ScatterOffset.layoutSize)
20+
.advanced(by: TeamIdOffset.layoutSize)
21+
.advanced(by: CodeLimit64.layoutSize)
22+
.advanced(by: ExecutableSegment.layoutSize)
23+
.assumingMemoryBound(to: CS_CodeDirectory_Runtime.self)
24+
.pointee
3125
return .init(
3226
layout: signature.isSwapped ? layout.swapped : layout
3327
)
@@ -68,7 +62,10 @@ extension CodeSignCodeDirectory {
6862
let offset = offset
6963
+ numericCast(runtime.preEncryptOffset)
7064
+ index * size
71-
return signature.data[offset ..< offset + size]
65+
return signature.fileSice.readData(
66+
offset: numericCast(offset),
67+
size: size
68+
)
7269
}
7370

7471
public func preEncryptHash(

Sources/MachOKit/Model/Codesign/CodeDirectory/CodeSignCodeDirectory+scatter.swift

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,11 @@ extension CodeSignCodeDirectory {
1313
guard isSupportsScatter else {
1414
return nil
1515
}
16-
let layout: CS_CodeDirectory_Scatter? = signature.data.withUnsafeBytes {
17-
guard let baseAddress = $0.baseAddress else {
18-
return nil
19-
}
20-
return baseAddress
21-
.advanced(by: offset)
22-
.advanced(by: layoutSize)
23-
.assumingMemoryBound(to: CS_CodeDirectory_Scatter.self)
24-
.pointee
25-
}
26-
guard let layout else { return nil }
16+
let layout: CS_CodeDirectory_Scatter = signature.fileSice.ptr
17+
.advanced(by: offset)
18+
.advanced(by: layoutSize)
19+
.assumingMemoryBound(to: CS_CodeDirectory_Scatter.self)
20+
.pointee
2721

2822
return .init(
2923
layout: signature.isSwapped ? layout.swapped : layout

Sources/MachOKit/Model/Codesign/CodeDirectory/CodeSignCodeDirectory+teamID.swift

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,13 @@ import Foundation
1010

1111
extension CodeSignCodeDirectory {
1212
public func teamIdOffset(in signature: MachOFile.CodeSign) -> TeamIdOffset? {
13-
guard isSupportsScatter else {
14-
return nil
15-
}
16-
let layout: CS_CodeDirectory_TeamID? = signature.data.withUnsafeBytes {
17-
guard let baseAddress = $0.baseAddress else {
18-
return nil
19-
}
20-
return baseAddress
21-
.advanced(by: offset)
22-
.advanced(by: layoutSize)
23-
.advanced(by: ScatterOffset.layoutSize)
24-
.assumingMemoryBound(to: CS_CodeDirectory_TeamID.self)
25-
.pointee
26-
}
27-
guard let layout else { return nil }
13+
guard isSupportsScatter else { return nil }
14+
let layout: CS_CodeDirectory_TeamID = signature.fileSice.ptr
15+
.advanced(by: offset)
16+
.advanced(by: layoutSize)
17+
.advanced(by: ScatterOffset.layoutSize)
18+
.assumingMemoryBound(to: CS_CodeDirectory_TeamID.self)
19+
.pointee
2820
return .init(
2921
layout: signature.isSwapped ? layout.swapped : layout
3022
)
@@ -35,14 +27,11 @@ extension CodeSignCodeDirectory {
3527
teamIdOffset.teamOffset != 0 else {
3628
return nil
3729
}
38-
return signature.data.withUnsafeBytes {
39-
guard let baseAddress = $0.baseAddress else { return nil }
40-
let ptr = baseAddress
41-
.advanced(by: offset)
42-
.advanced(by: Int(teamIdOffset.teamOffset))
43-
.assumingMemoryBound(to: CChar.self)
44-
return String(cString: ptr)
45-
}
30+
let ptr = signature.fileSice.ptr
31+
.advanced(by: offset)
32+
.advanced(by: Int(teamIdOffset.teamOffset))
33+
.assumingMemoryBound(to: CChar.self)
34+
return String(cString: ptr)
4635
}
4736
}
4837

0 commit comments

Comments
 (0)