Skip to content

Instantly share code, notes, and snippets.

@robinkunde
Created October 17, 2019 20:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save robinkunde/447c8f5a7610d3af35a3e4882abe5106 to your computer and use it in GitHub Desktop.
Save robinkunde/447c8f5a7610d3af35a3e4882abe5106 to your computer and use it in GitHub Desktop.
ASN1 mobile provision parser using DTFoundation
struct MobileProvision {
private let dict: [String: Any]?
init() {
let mpURL = Bundle.main.bundleURL.appendingPathComponent("embedded.mobileprovision")
guard let data = try? Data(contentsOf: mpURL) else {
dict = nil
return
}
let parser = ASN1ParserDelegate(data: data)
dict = parser.parse()
print(dict)
}
}
fileprivate class ASN1ParserDelegate: NSObject {
private let parser: DTASN1Parser
private var currentObjectIdentifier: String?
var dict: [String: Any]?
init(data: Data) {
self.parser = DTASN1Parser(data: data)
super.init()
self.parser.delegate = self
}
func parse() -> [String: Any]? {
guard parser.parse() else { return nil }
return dict
}
}
extension ASN1ParserDelegate: DTASN1ParserDelegate {
func parser(_ parser: DTASN1Parser!, foundObjectIdentifier objIdentifier: String!) {
currentObjectIdentifier = objIdentifier
}
func parser(_ parser: DTASN1Parser!, found data: Data!) {
guard currentObjectIdentifier == "1.2.840.113549.1.7.1" else { return }
currentObjectIdentifier = nil
do {
dict = try PropertyListSerialization.propertyList(
from: data,
options: [],
format: nil
) as? [String: Any]
} catch {
log(.error, error, tag: String(describing: type(of: self)))
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment