diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d1d1a1a --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +# Secrets — never commit real credentials +.env +OpenACExampleApp/Secrets.swift + +# Xcode +xcuserdata/ +*.xccheckout +*.moved-aside +DerivedData/ +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 +*.hmap +*.ipa + +# SPM +.build/ +.swiftpm/ + +# macOS +.DS_Store diff --git a/Info.plist b/Info.plist new file mode 100644 index 0000000..ea7a04f --- /dev/null +++ b/Info.plist @@ -0,0 +1,77 @@ + + + + + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleName + $(PRODUCT_NAME) + CFBundleDisplayName + OpenACExampleApp + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleInfoDictionaryVersion + 6.0 + + + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + mopro.OpenACExampleApp + CFBundleURLSchemes + + openac + + + + + + LSApplicationQueriesSchemes + + mobilemoica + + + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + + + UIApplicationSupportsIndirectInputEvents + + + + UILaunchScreen + + + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/OpenACExampleApp.xcodeproj/project.pbxproj b/OpenACExampleApp.xcodeproj/project.pbxproj index ff714e1..6b7201e 100644 --- a/OpenACExampleApp.xcodeproj/project.pbxproj +++ b/OpenACExampleApp.xcodeproj/project.pbxproj @@ -408,13 +408,10 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = N3ESL929H7; ENABLE_PREVIEWS = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchScreen_Generation = YES; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 26.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -440,13 +437,10 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = N3ESL929H7; ENABLE_PREVIEWS = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchScreen_Generation = YES; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 26.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", diff --git a/OpenACExampleApp/ContentView.swift b/OpenACExampleApp/ContentView.swift index f9b5b04..89939f4 100644 --- a/OpenACExampleApp/ContentView.swift +++ b/OpenACExampleApp/ContentView.swift @@ -8,7 +8,31 @@ import SwiftUI struct ContentView: View { - @State private var vm = ProofViewModel() + @Bindable var vm: ProofViewModel + + private var spTicketSymbol: String { + switch vm.spTicketStatus { + case .idle, .running: return "ticket" + case .success: return "checkmark.circle.fill" + case .failure: return "xmark.circle.fill" + } + } + + private var athResultSymbol: String { + switch vm.athResultStatus { + case .idle, .running: return "checkmark.shield" + case .success: return "checkmark.shield.fill" + case .failure: return "xmark.shield.fill" + } + } + + private func spTicketColor(_ status: ProofViewModel.StepStatus) -> Color { + switch status { + case .idle, .running: return .secondary + case .success: return .green + case .failure: return .red + } + } var body: some View { NavigationStack { @@ -22,13 +46,205 @@ struct ContentView: View { } } + // ── SP Ticket / MOICA ───────────────────────────────── + Section { + // Row 0 – ID number input + HStack { + Text("ID Number") + .font(.subheadline) + SecureField("e.g. A123456789", text: $vm.idNum) + .textFieldStyle(.roundedBorder) + } + + // Row 1 – fetch ticket + HStack(spacing: 16) { + Image(systemName: spTicketSymbol) + .font(.title2) + .foregroundStyle(spTicketColor(vm.spTicketStatus)) + .frame(width: 32) + + VStack(alignment: .leading, spacing: 2) { + Text("Get SP Ticket").font(.headline) + Text("POST /fido/sp-ticket").font(.caption).foregroundStyle(.secondary) + + if case .success(let detail) = vm.spTicketStatus { + Text(detail) + .font(.caption.monospacedDigit()) + .foregroundStyle(.green) + .padding(.top, 2) + if let ticket = vm.spTicket { + Text(ticket) + .font(.caption.monospaced()) + .foregroundStyle(.secondary) + .lineLimit(3) + .truncationMode(.middle) + .textSelection(.enabled) + .padding(.top, 1) + } + } + if case .failure(let msg) = vm.spTicketStatus { + Text(msg) + .font(.caption) + .foregroundStyle(.red) + .padding(.top, 2) + } + } + + Spacer() + + if case .running = vm.spTicketStatus { + ProgressView().controlSize(.small) + } else { + Button { + Task { await vm.computeSPTicket() } + } label: { + Image(systemName: "arrow.down.circle") + } + .buttonStyle(.bordered) + .controlSize(.small) + } + } + .padding(.vertical, 4) + .animation(.default, value: vm.spTicketStatus) + + // Row 2 – open MOICA (visible once ticket is ready) + if vm.spTicket != nil { + HStack(spacing: 16) { + Image(systemName: "person.badge.key.fill") + .font(.title2) + .foregroundStyle(.blue) + .frame(width: 32) + + VStack(alignment: .leading, spacing: 2) { + Text("Verify with MOICA").font(.headline) + Text("Opens mobilemoica:// · returns to openac://callback") + .font(.caption).foregroundStyle(.secondary) + + if let val = vm.rtnVal { + Text("rtn_val: \(val)") + .font(.caption.monospacedDigit()) + .foregroundStyle(.green) + .padding(.top, 2) + } + } + + Spacer() + + Button { + vm.openMOICA() + } label: { + Image(systemName: "arrow.up.forward.app") + } + .buttonStyle(.borderedProminent) + .controlSize(.small) + } + .padding(.vertical, 4) + } + + // Row 3 – ath-result + if vm.spTicket != nil { + HStack(spacing: 16) { + Image(systemName: athResultSymbol) + .font(.title2) + .foregroundStyle(spTicketColor(vm.athResultStatus)) + .frame(width: 32) + + VStack(alignment: .leading, spacing: 2) { + Text("Auth Result").font(.headline) + Text("POST /fido/ath-result").font(.caption).foregroundStyle(.secondary) + + if case .success(let detail) = vm.athResultStatus { + Text(detail) + .font(.caption.monospacedDigit()) + .foregroundStyle(.green) + .padding(.top, 2) + } + if case .failure(let msg) = vm.athResultStatus { + Text(msg) + .font(.caption) + .foregroundStyle(.red) + .padding(.top, 2) + } + } + + Spacer() + + if case .running = vm.athResultStatus { + ProgressView().controlSize(.small) + } else { + Button { + Task { await vm.pollAthResult() } + } label: { + Image(systemName: "checkmark.shield") + } + .buttonStyle(.bordered) + .controlSize(.small) + } + } + .padding(.vertical, 4) + .animation(.default, value: vm.athResultStatus) + } + + // Row 4 – generate input.json + HStack(spacing: 16) { + Image(systemName: { + switch vm.generateInputStatus { + case .idle, .running: return "doc.badge.gearshape" + case .success: return "checkmark.circle.fill" + case .failure: return "xmark.circle.fill" + } + }()) + .font(.title2) + .foregroundStyle(spTicketColor(vm.generateInputStatus)) + .frame(width: 32) + + VStack(alignment: .leading, spacing: 2) { + Text("Generate Input").font(.headline) + Text("Build circuit input from MOICA response").font(.caption).foregroundStyle(.secondary) + + if case .success(let detail) = vm.generateInputStatus { + Text(detail) + .font(.caption.monospacedDigit()) + .foregroundStyle(.green) + .lineLimit(2) + .truncationMode(.middle) + .padding(.top, 2) + } + if case .failure(let msg) = vm.generateInputStatus { + Text(msg) + .font(.caption) + .foregroundStyle(.red) + .padding(.top, 2) + } + } + + Spacer() + + if case .running = vm.generateInputStatus { + ProgressView().controlSize(.small) + } else { + Button { + Task { await vm.runGenerateInput() } + } label: { + Image(systemName: "arrow.trianglehead.2.clockwise") + } + .buttonStyle(.bordered) + .controlSize(.small) + } + } + .padding(.vertical, 4) + .animation(.default, value: vm.generateInputStatus) + } header: { + Text("FIDO / MOICA") + } + // ── Pipeline Steps ───────────────────────────────────── Section { StepRow(index: 1, title: "Setup Keys", subtitle: "Generate proving & verifying keys", status: vm.setupStatus) StepRow(index: 2, title: "Generate Proof", - subtitle: "Prove the RS256 circuit", + subtitle: "Prove the sha256rsa4096 circuit", status: vm.proveStatus) StepRow(index: 3, title: "Verify", subtitle: "Check the proof is valid", @@ -69,7 +285,7 @@ private struct CircuitDownloadCard: View { .font(.headline) .foregroundStyle(.blue) - Text("rs256.r1cs (~749 MB) must be downloaded before running the pipeline.") + Text("sha256rsa4096.r1cs (~97.43 MB) must be downloaded before running the pipeline.") .font(.subheadline) .foregroundStyle(.secondary) @@ -190,5 +406,5 @@ private struct IndexBadge: View { } #Preview { - ContentView() + ContentView(vm: ProofViewModel()) } diff --git a/OpenACExampleApp/MOICA-G3.cer b/OpenACExampleApp/MOICA-G3.cer new file mode 100644 index 0000000..a60b5ff Binary files /dev/null and b/OpenACExampleApp/MOICA-G3.cer differ diff --git a/OpenACExampleApp/MoicaFIDO.swift b/OpenACExampleApp/MoicaFIDO.swift new file mode 100644 index 0000000..03c88b9 --- /dev/null +++ b/OpenACExampleApp/MoicaFIDO.swift @@ -0,0 +1,214 @@ +import Foundation +import CryptoKit +import CommonCrypto + +// MARK: - Configuration + +private func getSpServiceID() -> String { + ProcessInfo.processInfo.environment["FIDO_SP_SERVICE_ID"] ?? Secrets.fidoSpServiceID +} + +private func getAESKeyBase64() -> String { + ProcessInfo.processInfo.environment["FIDO_AES_KEY"] ?? Secrets.fidoAESKey +} + +private let baseURL = "https://fidoapi.moi.gov.tw" + +// MARK: - Models + +struct SpTicketParams { + var transactionID: String + var idNum: String + var opCode: String // "SIGN" | "ATH" | "NFCSIGN" + var opMode: String // "APP2APP" | "I-SCAN" | … + var hint: String + var timeLimit: String // e.g. "600" + var signData: String // base64 string + var signType: String // "PKCS#7" | "CMS" | "RAW" + var hashAlgorithm: String + var tbsEncoding: String // "base64" | "utf8" +} + +struct SpTicketPayload: Decodable { + let transactionID: String + let spTicketID: String + let opCode: String + + enum CodingKeys: String, CodingKey { + case transactionID = "transaction_id" + case spTicketID = "sp_ticket_id" + case opCode = "op_code" + } +} + +struct SignResult: Decodable { + let hashedIDNum: String? + let signedResponse: String? + let idpChecksum: String? + let cert: String? + + enum CodingKeys: String, CodingKey { + case hashedIDNum = "hashed_id_num" + case signedResponse = "signed_response" + case idpChecksum = "idp_checksum" + case cert + } +} + +struct AthOrSignResultResponse: Decodable { + let errorCode: String + let errorMessage: String + let result: SignResult? + + enum CodingKeys: String, CodingKey { + case errorCode = "error_code" + case errorMessage = "error_message" + case result + } +} + +// MARK: - Checksum + +enum FIDOError: Error { + case invalidAESKey + case encryptionFailed + case invalidSpTicket(String) + case httpError(Int) + case decodingError(String) +} + +/// Implements the 5-step sp_checksum algorithm from the spec. +func computeSpChecksum(payload: String) throws -> String { + // [2] SHA-256 → hex string + let payloadData = Data(payload.utf8) + let sha256Bytes = SHA256.hash(data: payloadData) + let sha256Hex = sha256Bytes.map { String(format: "%02x", $0) }.joined() + + // [1] decode AES key + guard let keyData = Data(base64Encoded: getAESKeyBase64()), + keyData.count == 32 else { + throw FIDOError.invalidAESKey + } + + // [3] zero IV (12 bytes) + let iv = Data(repeating: 0, count: 12) + + // [4] AES-256-GCM encrypt + let symmetricKey = SymmetricKey(data: keyData) + let nonce = try AES.GCM.Nonce(data: iv) + let sealed = try AES.GCM.seal(Data(sha256Hex.utf8), using: symmetricKey, nonce: nonce) + + // ciphertext + tag (CryptoKit separates them) + let ciphertextWithTag = sealed.ciphertext + sealed.tag + + // [5] hex(iv) + hex(ciphertext+tag) + let ivHex = iv.map { String(format: "%02x", $0) }.joined() + let ctHex = ciphertextWithTag.map { String(format: "%02x", $0) }.joined() + return ivHex + ctHex +} + +// MARK: - sp_ticket decode + +/// Splits "Payload.Digest" on the last '.' and base64url-decodes the Payload segment. +func decodeSpTicket(_ spTicket: String) throws -> SpTicketPayload { + guard let dotIndex = spTicket.lastIndex(of: ".") else { + throw FIDOError.invalidSpTicket("missing '.' separator") + } + let payloadB64 = String(spTicket[spTicket.startIndex.. 0 { base64 += String(repeating: "=", count: 4 - remainder) } + + guard let raw = Data(base64Encoded: base64) else { + throw FIDOError.invalidSpTicket("base64 decode failed") + } + + return try JSONDecoder().decode(SpTicketPayload.self, from: raw) +} + +// MARK: - API: getSpTicket + +func getSpTicket(params: SpTicketParams) async throws -> String { + let payload = params.transactionID + getSpServiceID() + params.idNum + + params.opCode + params.opMode + params.hint + params.signData + let checksum = try computeSpChecksum(payload: payload) + print("checksum: \(checksum)") + print("payload: \(payload)") + + let body: [String: Any] = [ + "transaction_id": params.transactionID, + "sp_service_id": getSpServiceID(), + "sp_checksum": checksum, + "id_num": params.idNum, + "op_code": params.opCode, + "op_mode": params.opMode, + "hint": params.hint, + "time_limit": params.timeLimit, + "sign_info": [ + "tbs_encoding": params.tbsEncoding, + "sign_data": params.signData, + "hash_algorithm": params.hashAlgorithm, + "sign_type": params.signType, + ] + ] + + var req = URLRequest(url: URL(string: "\(baseURL)/moise/sp/getSpTicket")!) + req.httpMethod = "POST" + req.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") + req.httpBody = try JSONSerialization.data(withJSONObject: body) + + let (data, response) = try await URLSession.shared.data(for: req) + if let http = response as? HTTPURLResponse, http.statusCode != 200 { + throw FIDOError.httpError(http.statusCode) + } + return String(data: data, encoding: .utf8) ?? "" +} + +// MARK: - API: getAthOrSignResult + +/// Per spec, callers should wait at least 4 seconds between poll attempts. +func getAthOrSignResult(spTicket: String) async throws -> AthOrSignResultResponse { + let ticket = try decodeSpTicket(spTicket) + + let payload = ticket.transactionID + getSpServiceID() + ticket.spTicketID + let checksum = try computeSpChecksum(payload: payload) + + let body: [String: Any] = [ + "transaction_id": ticket.transactionID, + "sp_service_id": getSpServiceID(), + "sp_checksum": checksum, + "sp_ticket_id": ticket.spTicketID, + ] + + var req = URLRequest(url: URL(string: "\(baseURL)/moise/sp/getAthOrSignResult")!) + req.httpMethod = "POST" + req.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") + req.httpBody = try JSONSerialization.data(withJSONObject: body) + + let (data, response) = try await URLSession.shared.data(for: req) + if let http = response as? HTTPURLResponse, http.statusCode != 200 { + throw FIDOError.httpError(http.statusCode) + } + return try JSONDecoder().decode(AthOrSignResultResponse.self, from: data) +} + +// MARK: - Poll Sign Result + +func pollSignResult(spTicket: String) async throws -> AthOrSignResultResponse { + while true { + let result = try await getAthOrSignResult(spTicket: spTicket) + switch result.errorCode { + case "0": + return result + case "20002", "20003": + print("Waiting for user action...") + try await Task.sleep(nanoseconds: 4_000_000_000) // 4 秒 + default: + throw FIDOError.decodingError("error \(result.errorCode): \(result.errorMessage)") + } + } +} \ No newline at end of file diff --git a/OpenACExampleApp/OpenACExampleAppApp.swift b/OpenACExampleApp/OpenACExampleAppApp.swift index 213ac69..c76a3f0 100644 --- a/OpenACExampleApp/OpenACExampleAppApp.swift +++ b/OpenACExampleApp/OpenACExampleAppApp.swift @@ -9,9 +9,14 @@ import SwiftUI @main struct OpenACExampleAppApp: App { + @State private var vm = ProofViewModel() + var body: some Scene { WindowGroup { - ContentView() + ContentView(vm: vm) + .onOpenURL { url in + vm.handleCallback(url: url) + } } } } diff --git a/OpenACExampleApp/ProofViewModel.swift b/OpenACExampleApp/ProofViewModel.swift index 586b153..fa8ffa1 100644 --- a/OpenACExampleApp/ProofViewModel.swift +++ b/OpenACExampleApp/ProofViewModel.swift @@ -5,10 +5,11 @@ import Foundation import Observation +import UIKit import OpenACSwift import ZIPFoundation -private let circuitZipURL = URL(string: "https://github.com/zkmopro/zkID/releases/download/latest/rs256.r1cs.zip")! +private let circuitZipURL = URL(string: "https://pub-ef10768896384fdf9617f26d43e11a65.r2.dev/sha256rsa4096.r1cs.zip")! @Observable @MainActor @@ -57,15 +58,21 @@ final class ProofViewModel { let fm = FileManager.default try fm.createDirectory(at: workDir, withIntermediateDirectories: true) + // For simulator testing // Copy bundled input.json on first launch. if let src = Bundle.main.path(forResource: "input", ofType: "json") { let dst = workDir.appendingPathComponent("input.json") - if !fm.fileExists(atPath: dst.path) { - try fm.copyItem(atPath: src, toPath: dst.path) - } + print("copying input.json from \(src) to \(dst.path)") + try fm.copyItem(atPath: src, toPath: dst.path) } + circuitReady = fm.fileExists(atPath: workDir.appendingPathComponent("sha256rsa4096.r1cs").path) - circuitReady = fm.fileExists(atPath: workDir.appendingPathComponent("rs256.r1cs").path) + // Copy bundled MOICA-G3.cer into workDir if not already present + let certDest = workDir.appendingPathComponent("MOICA-G3.cer") + if !fm.fileExists(atPath: certDest.path), + let certSrc = Bundle.main.url(forResource: "MOICA-G3", withExtension: "cer") { + try fm.copyItem(at: certSrc, to: certDest) + } } // MARK: - Download Circuit @@ -79,7 +86,7 @@ final class ProofViewModel { unzipSeconds = nil let tmpZip = FileManager.default.temporaryDirectory - .appendingPathComponent("rs256.r1cs.zip") + .appendingPathComponent("sha256rsa4096.r1cs.zip") let destDir = workDir do { @@ -112,7 +119,7 @@ final class ProofViewModel { unzipSeconds = unzip circuitReady = FileManager.default.fileExists( - atPath: workDir.appendingPathComponent("rs256.r1cs").path + atPath: workDir.appendingPathComponent("sha256rsa4096.r1cs").path ) } catch { downloadError = error.localizedDescription @@ -134,10 +141,107 @@ final class ProofViewModel { try FileManager.default.moveItem(at: tmpURL, to: destination) } + // MARK: - SP Ticket / MOICA + + static let returnScheme = "openac" + static let returnURL = "\(returnScheme)://callback" + + var idNum: String = "A123456789" + var spTicketStatus: StepStatus = .idle + var spTicket: String? + var tbs: String? + var rtnVal: String? + + // Stored ath-result fields used to generate circuit input + var athResponseString: String? + var athIssuerCert: String? + var athIssuerId: String = "g2" + var generateInputStatus: StepStatus = .idle + + + func computeSPTicket() async { + spTicketStatus = .running + spTicket = nil + rtnVal = nil + do { + let raw = try await getSpTicket(params: SpTicketParams( + transactionID: UUID().uuidString, + idNum: idNum, + opCode: "SIGN", + opMode: "APP2APP", + hint: "待簽署資料", + timeLimit: "600", + signData: "ZTc3NWYyODA1ZmI5OTNlMDVhMjA4ZGJmZjE1ZDFjMQ==", + signType: "PKCS#1", + hashAlgorithm: "SHA256", + tbsEncoding: "base64" + )) + + let json = try JSONSerialization.jsonObject(with: Data(raw.utf8)) as! [String: Any] + spTicket = ((json["result"] as? [String: Any])?["sp_ticket"] as? String) ?? "" + print("spTicket: \(spTicket)") + + spTicketStatus = spTicket?.isEmpty == false + ? .success("ticket received") + : .failure("sp_ticket not found in response: \(raw)") + } catch { + spTicketStatus = .failure(error.localizedDescription) + print("spTicketStatus: \(spTicketStatus), error: \(error)") + } + } + + var athResultStatus: StepStatus = .idle + + func openMOICA() { + guard let ticket = spTicket else { return } + var comps = URLComponents() + comps.scheme = "mobilemoica" + comps.host = "moica.moi.gov.tw" + comps.path = "/a2a/verifySign" + let rtnUrlBase64 = Data(Self.returnURL.utf8).base64EncodedString() + comps.queryItems = [ + URLQueryItem(name: "sp_ticket", value: ticket), + URLQueryItem(name: "rtn_url", value: rtnUrlBase64), + URLQueryItem(name: "rtn_val", value: ""), + ] + guard let deepLink = comps.url else { return } + print("deepLink: \(deepLink)") + UIApplication.shared.open(deepLink) + } + + + func pollAthResult() async { + athResultStatus = .running + guard let ticket = spTicket else { + athResultStatus = .failure("No sp_ticket available") + return + } + do { + let result = try await pollSignResult(spTicket: ticket) + athResponseString = result.result?.signedResponse + athIssuerCert = result.result?.cert + athResultStatus = .success("result: \(result)") + print("pollAthResult: \(athResultStatus)") + } catch { + athResultStatus = .failure(error.localizedDescription) + print("pollAthResult error: \(athResultStatus)") + } + } + + + func handleCallback(url: URL) { + guard url.scheme == Self.returnScheme, + let comps = URLComponents(url: url, resolvingAgainstBaseURL: false), + let item = comps.queryItems?.first(where: { $0.name == "rtn_val" }) + else { return } + rtnVal = item.value + } + // MARK: - Pipeline Actions func reset() { + generateInputStatus = .idle setupStatus = .idle proveStatus = .idle verifyStatus = .idle @@ -158,12 +262,43 @@ final class ProofViewModel { isRunning = false } + func runGenerateInput() async { + let tbs = "e775f2805fb993e05a208dbff15d1c1" + let outPath = workDir.appendingPathComponent("input.json").path + guard let certb64 = athIssuerCert else { return } + guard let signedResponse = athResponseString else { return } + let issuerCertPath = workDir.appendingPathComponent("MOICA-G3.cer").path + print("certb64: \(certb64)") + print("signedResponse: \(signedResponse)") + print("tbs: \(tbs)") + print("issuerCertPath: \(issuerCertPath)") + print("outPath: \(outPath)") + do { + let resultPath = try await Task.detached(priority: .userInitiated) { + try generateInputFido( + certb64: certb64, + signedResponse: signedResponse, + tbs: tbs, + issuerCertPath: issuerCertPath, + smtServer: nil, + issuerId: "g2", + outputPath: outPath + ) + }.value + generateInputStatus = .success(outPath) + let resultJson = try JSONSerialization.jsonObject(with: Data(contentsOf: URL(fileURLWithPath: resultPath))) as? [String: Any] + print("resultJson: \(resultJson)") + } catch { + generateInputStatus = .failure(error.localizedDescription) + } + } + func runSetupKeys() async { setupStatus = .running let dp = documentsPath, ip = inputPath do { let msg = try await Task.detached(priority: .userInitiated) { - try setupKeys(documentsPath: dp, inputPath: ip) + try setupKeysFido(documentsPath: dp, inputPath: ip) }.value setupStatus = .success(msg) } catch { @@ -176,7 +311,7 @@ final class ProofViewModel { let dp = documentsPath, ip = inputPath do { let result = try await Task.detached(priority: .userInitiated) { - try prove(documentsPath: dp, inputPath: ip) + try proveFido(documentsPath: dp, inputPath: ip) }.value proveStatus = .success("\(result.proveMs) ms · \(result.proofSizeBytes) B") } catch { @@ -189,7 +324,7 @@ final class ProofViewModel { let dp = documentsPath do { let valid = try await Task.detached(priority: .userInitiated) { - try verify(documentsPath: dp) + try verifyFido(documentsPath: dp) }.value verifyStatus = valid ? .success("Proof is valid") : .failure("Proof is invalid") } catch { diff --git a/OpenACExampleApp/input.json b/OpenACExampleApp/input.json index 29d3fc8..fba14c0 100644 --- a/OpenACExampleApp/input.json +++ b/OpenACExampleApp/input.json @@ -1,4947 +1,3435 @@ { - "actual_issuer_tbs_length": 929, - "actual_user_cert_length": 1209, - "issuer_rsa_modulus": [ - "932230206641401848877844445425379613", - "1287813184044732092073377422384224016", - "2331126630674950836225311866951768718", - "360589092198180265212888939809011440", - "1907563441447849965593182097950170942", - "2461267770107958274517738559390273583", - "1010733374954290575288780000092573838", - "1683625718575020148930863150454080428", - "129656507997600988365044273322969115", - "510985421691116704543531666676558324", - "2024945274094533494243013635215016762", - "440263969485630072528881845058421990", - "297876808398015751565134147336044994", - "1365895900502788362712388888144105795", - "1629108674610970206607912730364650912", - "1391347499687288551910207307756127797", - "3242019074581394271774350988041718" - ], - "issuer_rsa_signature": [ - "965568229795285643241515668459312630", - "2421852676968634036437323278750978035", - "778766183732444381452069825687263377", - "1488170628553596179265362682399046449", - "900657615547990518924136689177902079", - "1534458891855660572476099782650058499", - "2490073385647401409907062374676546585", - "1708605517444913122292420194194941889", - "2413442863116929327929910396483042924", - "2119587273919973261416538825098632046", - "2409139239914692852402434960849091454", - "993294171745158051330089410216802097", - "100653687134846040502204449506447309", - "1856408120865602167339975731613485093", - "1776138548364813655439119360512948322", - "1288753746642150649311464213943377217", - "1895562030354609820082169196270556" - ], - "issuer_tbs": [ - "48", - "130", - "3", - "157", - "160", - "3", - "2", - "1", - "2", - "2", - "16", - "99", - "154", - "202", - "136", - "181", - "104", - "224", - "247", - "170", - "172", - "71", - "25", - "83", - "249", - "98", - "253", - "48", - "13", - "6", - "9", - "42", - "134", - "72", - "134", - "247", - "13", - "1", - "1", - "11", - "5", - "0", - "48", - "71", - "49", - "11", - "48", - "9", - "6", - "3", - "85", - "4", - "6", - "19", - "2", - "84", - "87", - "49", - "18", - "48", - "16", - "6", - "3", - "85", - "4", - "10", - "12", - "9", - "232", - "161", - "140", - "230", - "148", - "191", - "233", - "153", - "162", - "49", - "36", - "48", - "34", - "6", - "3", - "85", - "4", - "11", - "12", - "27", - "229", - "133", - "167", - "230", - "148", - "191", - "233", - "131", - "168", - "230", - "134", - "145", - "232", - "173", - "137", - "231", - "174", - "161", - "231", - "144", - "134", - "228", - "184", - "173", - "229", - "191", - "131", - "48", - "30", - "23", - "13", - "50", - "50", - "48", - "55", - "49", - "50", - "48", - "52", - "51", - "53", - "53", - "54", - "90", - "23", - "13", - "50", - "55", - "48", - "55", - "49", - "50", - "49", - "53", - "53", - "57", - "53", - "57", - "90", - "48", - "60", - "49", - "11", - "48", - "9", - "6", - "3", - "85", - "4", - "6", - "19", - "2", - "84", - "87", - "49", - "18", - "48", - "16", - "6", - "3", - "85", - "4", - "3", - "12", - "9", - "233", - "132", - "173", - "233", - "155", - "133", - "230", - "150", - "135", - "49", - "25", - "48", - "23", - "6", - "3", - "85", - "4", - "5", - "19", - "16", - "49", - "50", - "48", - "48", - "50", - "50", - "55", - "55", - "50", - "50", - "48", - "48", - "56", - "50", - "49", - "53", - "48", - "130", - "1", - "34", - "48", - "13", - "6", - "9", - "42", - "134", - "72", - "134", - "247", - "13", - "1", - "1", - "1", - "5", - "0", - "3", - "130", - "1", - "15", - "0", - "48", - "130", - "1", - "10", - "2", - "130", - "1", - "1", - "0", - "186", - "122", - "17", - "69", - "136", - "225", - "254", - "234", - "165", - "26", - "14", - "25", - "107", - "190", - "95", - "63", - "149", - "45", - "32", - "14", - "67", - "165", - "199", - "188", - "60", - "252", - "111", - "245", - "56", - "157", - "13", - "138", - "59", - "245", - "227", - "67", - "168", - "247", - "254", - "4", - "198", - "124", - "55", - "15", - "137", - "180", - "93", - "41", - "46", - "185", - "14", - "126", - "97", - "215", - "194", - "58", - "132", - "246", - "205", - "83", - "30", - "4", - "110", - "76", - "108", - "32", - "18", - "228", - "79", - "20", - "179", - "208", - "59", - "216", - "139", - "28", - "56", - "88", - "112", - "106", - "233", - "81", - "142", - "165", - "247", - "16", - "149", - "202", - "71", - "55", - "61", - "3", - "237", - "233", - "240", - "159", - "104", - "58", - "44", - "136", - "195", - "98", - "46", - "82", - "3", - "47", - "189", - "227", - "192", - "169", - "116", - "120", - "12", - "101", - "230", - "197", - "76", - "74", - "185", - "59", - "78", - "28", - "9", - "33", - "77", - "252", - "75", - "144", - "119", - "26", - "69", - "24", - "157", - "144", - "24", - "105", - "255", - "8", - "52", - "4", - "239", - "255", - "137", - "11", - "49", - "102", - "250", - "34", - "182", - "69", - "102", - "79", - "179", - "247", - "13", - "236", - "110", - "118", - "74", - "157", - "166", - "148", - "122", - "171", - "136", - "246", - "219", - "112", - "249", - "226", - "92", - "161", - "36", - "85", - "209", - "205", - "239", - "115", - "175", - "1", - "188", - "240", - "62", - "213", - "189", - "100", - "130", - "208", - "237", - "161", - "139", - "210", - "74", - "84", - "159", - "31", - "175", - "181", - "226", - "248", - "41", - "178", - "115", - "98", - "248", - "20", - "100", - "77", - "208", - "153", - "234", - "124", - "184", - "90", - "237", - "215", - "137", - "3", - "138", - "28", - "83", - "10", - "226", - "217", - "90", - "68", - "211", - "45", - "229", - "213", - "53", - "130", - "138", - "228", - "245", - "86", - "134", - "162", - "207", - "140", - "92", - "226", - "129", - "24", - "105", - "221", - "178", - "92", - "213", - "59", - "3", - "69", - "164", - "193", - "30", - "69", - "2", - "3", - "1", - "0", - "1", - "163", - "130", - "1", - "166", - "48", - "130", - "1", - "162", - "48", - "31", - "6", - "3", - "85", - "29", - "35", - "4", - "24", - "48", - "22", - "128", - "20", - "250", - "155", - "52", - "103", - "9", - "10", - "152", - "34", - "247", - "98", - "72", - "139", - "130", - "38", - "166", - "69", - "197", - "195", - "34", - "164", - "48", - "29", - "6", - "3", - "85", - "29", - "14", - "4", - "22", - "4", - "20", - "192", - "41", - "190", - "128", - "217", - "183", - "243", - "150", - "2", - "41", - "128", - "149", - "170", - "229", - "244", - "201", - "120", - "197", - "193", - "2", - "48", - "14", - "6", - "3", - "85", - "29", - "15", - "1", - "1", - "255", - "4", - "4", - "3", - "2", - "7", - "128", - "48", - "20", - "6", - "3", - "85", - "29", - "32", - "4", - "13", - "48", - "11", - "48", - "9", - "6", - "7", - "96", - "134", - "118", - "101", - "0", - "3", - "3", - "48", - "51", - "6", - "3", - "85", - "29", - "9", - "4", - "44", - "48", - "42", - "48", - "21", - "6", - "7", - "96", - "134", - "118", - "1", - "100", - "2", - "1", - "49", - "10", - "6", - "8", - "96", - "134", - "118", - "1", - "100", - "3", - "1", - "1", - "48", - "17", - "6", - "7", - "96", - "134", - "118", - "1", - "100", - "2", - "51", - "49", - "6", - "12", - "4", - "56", - "51", - "49", - "49", - "48", - "124", - "6", - "3", - "85", - "29", - "31", - "4", - "117", - "48", - "115", - "48", - "54", - "160", - "52", - "160", - "50", - "134", - "48", - "104", - "116", - "116", - "112", - "58", - "47", - "47", - "111", - "99", - "115", - "112", - "45", - "109", - "111", - "105", - "99", - "97", - "46", - "109", - "111", - "105", - "46", - "103", - "111", - "118", - "46", - "116", - "119", - "47", - "99", - "114", - "108", - "47", - "77", - "79", - "73", - "67", - "65", - "45", - "49", - "48", - "45", - "51", - "49", - "46", - "99", - "114", - "108", - "48", - "57", - "160", - "55", - "160", - "53", - "134", - "51", - "104", - "116", - "116", - "112", - "58", - "47", - "47", - "111", - "99", - "115", - "112", - "45", - "109", - "111", - "105", - "99", - "97", - "46", - "109", - "111", - "105", - "46", - "103", - "111", - "118", - "46", - "116", - "119", - "47", - "99", - "114", - "108", - "47", - "77", - "79", - "73", - "67", - "65", - "45", - "99", - "111", - "109", - "112", - "108", - "101", - "116", - "101", - "46", - "99", - "114", - "108", - "48", - "129", - "134", - "6", - "8", - "43", - "6", - "1", - "5", - "5", - "7", - "1", - "1", - "4", - "122", - "48", - "120", - "48", - "71", - "6", - "8", - "43", - "6", - "1", - "5", - "5", - "7", - "48", - "2", - "134", - "59", - "104", - "116", - "116", - "112", - "58", - "47", - "47", - "109", - "111", - "105", - "99", - "97", - "46", - "110", - "97", - "116", - "46", - "103", - "111", - "118", - "46", - "116", - "119", - "47", - "114", - "101", - "112", - "111", - "115", - "105", - "116", - "111", - "114", - "121", - "47", - "67", - "101", - "114", - "116", - "115", - "47", - "73", - "115", - "115", - "117", - "101", - "100", - "84", - "111", - "84", - "104", - "105", - "115", - "67", - "65", - "46", - "112", - "55", - "98", - "48", - "45", - "6", - "8", - "43", - "6", - "1", - "5", - "5", - "7", - "48", - "1", - "134", - "33", - "104", - "116", - "116", - "112", - "58", - "47", - "47", - "111", - "99", - "115", - "112", - "45", - "109", - "111", - "105", - "99", - "97", - "46", - "109", - "111", - "105", - "46", - "103", - "111", - "118", - "46", - "116", - "119", - "47", - "79", - "67", - "83", - "80", - "128", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "29", - "8", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0" - ], - "issuer_tbs_length": 960, - "serialNumber": "132397293176834651891285756205883548413", - "serial_number_offset": 15, - "smtIsOld0": "1", - "smtOldKey": "0", - "smtOldValue": "0", - "smtRoot": "0", - "smtSiblings": [ - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0" - ], - "subject_dn": [ - 48, - 60, - 49, - 11, - 48, - 9, - 6, - 3, - 85, - 4, - 6, - 19, - 2, - 84, - 87, - 49, - 18, - 48, - 16, - 6, - 3, - 85, - 4, - 3, - 12, - 9, - 233, - 132, - 173, - 233, - 155, - 133, - 230, - 150, - 135, - 49, - 25, - 48, - 23, - 6, - 3, - 85, - 4, - 5, - 19, - 16, - 49, - 50, - 48, - 48, - 50, - 50, - 55, - 55, - 50, - 50, - 48, - 48, - 56, - 50, - 49, - 53, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ], - "subject_dn_length": 62, - "subject_dn_offset": 151, - "tbs": [ - "101", - "55", - "55", - "53", - "102", - "50", - "56", - "48", - "53", - "102", - "98", - "57", - "57", - "51", - "101", - "48", - "53", - "97", - "50", - "48", - "56", - "100", - "98", - "102", - "102", - "49", - "53", - "100", - "49", - "99", - "49", - "128", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "248", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0", - "0" - ], - "tbs_length": 64, - "user_cert_zero_padded": [ - 48, - 130, - 4, - 181, - 48, - 130, - 3, - 157, - 160, - 3, - 2, - 1, - 2, - 2, - 16, - 99, - 154, - 202, - 136, - 181, - 104, - 224, - 247, - 170, - 172, - 71, - 25, - 83, - 249, - 98, - 253, - 48, - 13, - 6, - 9, - 42, - 134, - 72, - 134, - 247, - 13, - 1, - 1, - 11, - 5, - 0, - 48, - 71, - 49, - 11, - 48, - 9, - 6, - 3, - 85, - 4, - 6, - 19, - 2, - 84, - 87, - 49, - 18, - 48, - 16, - 6, - 3, - 85, - 4, - 10, - 12, - 9, - 232, - 161, - 140, - 230, - 148, - 191, - 233, - 153, - 162, - 49, - 36, - 48, - 34, - 6, - 3, - 85, - 4, - 11, - 12, - 27, - 229, - 133, - 167, - 230, - 148, - 191, - 233, - 131, - 168, - 230, - 134, - 145, - 232, - 173, - 137, - 231, - 174, - 161, - 231, - 144, - 134, - 228, - 184, - 173, - 229, - 191, - 131, - 48, - 30, - 23, - 13, - 50, - 50, - 48, - 55, - 49, - 50, - 48, - 52, - 51, - 53, - 53, - 54, - 90, - 23, - 13, - 50, - 55, - 48, - 55, - 49, - 50, - 49, - 53, - 53, - 57, - 53, - 57, - 90, - 48, - 60, - 49, - 11, - 48, - 9, - 6, - 3, - 85, - 4, - 6, - 19, - 2, - 84, - 87, - 49, - 18, - 48, - 16, - 6, - 3, - 85, - 4, - 3, - 12, - 9, - 233, - 132, - 173, - 233, - 155, - 133, - 230, - 150, - 135, - 49, - 25, - 48, - 23, - 6, - 3, - 85, - 4, - 5, - 19, - 16, - 49, - 50, - 48, - 48, - 50, - 50, - 55, - 55, - 50, - 50, - 48, - 48, - 56, - 50, - 49, - 53, - 48, - 130, - 1, - 34, - 48, - 13, - 6, - 9, - 42, - 134, - 72, - 134, - 247, - 13, - 1, - 1, - 1, - 5, - 0, - 3, - 130, - 1, - 15, - 0, - 48, - 130, - 1, - 10, - 2, - 130, - 1, - 1, - 0, - 186, - 122, - 17, - 69, - 136, - 225, - 254, - 234, - 165, - 26, - 14, - 25, - 107, - 190, - 95, - 63, - 149, - 45, - 32, - 14, - 67, - 165, - 199, - 188, - 60, - 252, - 111, - 245, - 56, - 157, - 13, - 138, - 59, - 245, - 227, - 67, - 168, - 247, - 254, - 4, - 198, - 124, - 55, - 15, - 137, - 180, - 93, - 41, - 46, - 185, - 14, - 126, - 97, - 215, - 194, - 58, - 132, - 246, - 205, - 83, - 30, - 4, - 110, - 76, - 108, - 32, - 18, - 228, - 79, - 20, - 179, - 208, - 59, - 216, - 139, - 28, - 56, - 88, - 112, - 106, - 233, - 81, - 142, - 165, - 247, - 16, - 149, - 202, - 71, - 55, - 61, - 3, - 237, - 233, - 240, - 159, - 104, - 58, - 44, - 136, - 195, - 98, - 46, - 82, - 3, - 47, - 189, - 227, - 192, - 169, - 116, - 120, - 12, - 101, - 230, - 197, - 76, - 74, - 185, - 59, - 78, - 28, - 9, - 33, - 77, - 252, - 75, - 144, - 119, - 26, - 69, - 24, - 157, - 144, - 24, - 105, - 255, - 8, - 52, - 4, - 239, - 255, - 137, - 11, - 49, - 102, - 250, - 34, - 182, - 69, - 102, - 79, - 179, - 247, - 13, - 236, - 110, - 118, - 74, - 157, - 166, - 148, - 122, - 171, - 136, - 246, - 219, - 112, - 249, - 226, - 92, - 161, - 36, - 85, - 209, - 205, - 239, - 115, - 175, - 1, - 188, - 240, - 62, - 213, - 189, - 100, - 130, - 208, - 237, - 161, - 139, - 210, - 74, - 84, - 159, - 31, - 175, - 181, - 226, - 248, - 41, - 178, - 115, - 98, - 248, - 20, - 100, - 77, - 208, - 153, - 234, - 124, - 184, - 90, - 237, - 215, - 137, - 3, - 138, - 28, - 83, - 10, - 226, - 217, - 90, - 68, - 211, - 45, - 229, - 213, - 53, - 130, - 138, - 228, - 245, - 86, - 134, - 162, - 207, - 140, - 92, - 226, - 129, - 24, - 105, - 221, - 178, - 92, - 213, - 59, - 3, - 69, - 164, - 193, - 30, - 69, - 2, - 3, - 1, - 0, - 1, - 163, - 130, - 1, - 166, - 48, - 130, - 1, - 162, - 48, - 31, - 6, - 3, - 85, - 29, - 35, - 4, - 24, - 48, - 22, - 128, - 20, - 250, - 155, - 52, - 103, - 9, - 10, - 152, - 34, - 247, - 98, - 72, - 139, - 130, - 38, - 166, - 69, - 197, - 195, - 34, - 164, - 48, - 29, - 6, - 3, - 85, - 29, - 14, - 4, - 22, - 4, - 20, - 192, - 41, - 190, - 128, - 217, - 183, - 243, - 150, - 2, - 41, - 128, - 149, - 170, - 229, - 244, - 201, - 120, - 197, - 193, - 2, - 48, - 14, - 6, - 3, - 85, - 29, - 15, - 1, - 1, - 255, - 4, - 4, - 3, - 2, - 7, - 128, - 48, - 20, - 6, - 3, - 85, - 29, - 32, - 4, - 13, - 48, - 11, - 48, - 9, - 6, - 7, - 96, - 134, - 118, - 101, - 0, - 3, - 3, - 48, - 51, - 6, - 3, - 85, - 29, - 9, - 4, - 44, - 48, - 42, - 48, - 21, - 6, - 7, - 96, - 134, - 118, - 1, - 100, - 2, - 1, - 49, - 10, - 6, - 8, - 96, - 134, - 118, - 1, - 100, - 3, - 1, - 1, - 48, - 17, - 6, - 7, - 96, - 134, - 118, - 1, - 100, - 2, - 51, - 49, - 6, - 12, - 4, - 56, - 51, - 49, - 49, - 48, - 124, - 6, - 3, - 85, - 29, - 31, - 4, - 117, - 48, - 115, - 48, - 54, - 160, - 52, - 160, - 50, - 134, - 48, - 104, - 116, - 116, - 112, - 58, - 47, - 47, - 111, - 99, - 115, - 112, - 45, - 109, - 111, - 105, - 99, - 97, - 46, - 109, - 111, - 105, - 46, - 103, - 111, - 118, - 46, - 116, - 119, - 47, - 99, - 114, - 108, - 47, - 77, - 79, - 73, - 67, - 65, - 45, - 49, - 48, - 45, - 51, - 49, - 46, - 99, - 114, - 108, - 48, - 57, - 160, - 55, - 160, - 53, - 134, - 51, - 104, - 116, - 116, - 112, - 58, - 47, - 47, - 111, - 99, - 115, - 112, - 45, - 109, - 111, - 105, - 99, - 97, - 46, - 109, - 111, - 105, - 46, - 103, - 111, - 118, - 46, - 116, - 119, - 47, - 99, - 114, - 108, - 47, - 77, - 79, - 73, - 67, - 65, - 45, - 99, - 111, - 109, - 112, - 108, - 101, - 116, - 101, - 46, - 99, - 114, - 108, - 48, - 129, - 134, - 6, - 8, - 43, - 6, - 1, - 5, - 5, - 7, - 1, - 1, - 4, - 122, - 48, - 120, - 48, - 71, - 6, - 8, - 43, - 6, - 1, - 5, - 5, - 7, - 48, - 2, - 134, - 59, - 104, - 116, - 116, - 112, - 58, - 47, - 47, - 109, - 111, - 105, - 99, - 97, - 46, - 110, - 97, - 116, - 46, - 103, - 111, - 118, - 46, - 116, - 119, - 47, - 114, - 101, - 112, - 111, - 115, - 105, - 116, - 111, - 114, - 121, - 47, - 67, - 101, - 114, - 116, - 115, - 47, - 73, - 115, - 115, - 117, - 101, - 100, - 84, - 111, - 84, - 104, - 105, - 115, - 67, - 65, - 46, - 112, - 55, - 98, - 48, - 45, - 6, - 8, - 43, - 6, - 1, - 5, - 5, - 7, - 48, - 1, - 134, - 33, - 104, - 116, - 116, - 112, - 58, - 47, - 47, - 111, - 99, - 115, - 112, - 45, - 109, - 111, - 105, - 99, - 97, - 46, - 109, - 111, - 105, - 46, - 103, - 111, - 118, - 46, - 116, - 119, - 47, - 79, - 67, - 83, - 80, - 48, - 13, - 6, - 9, - 42, - 134, - 72, - 134, - 247, - 13, - 1, - 1, - 11, - 5, - 0, - 3, - 130, - 1, - 1, - 0, - 93, - 117, - 91, - 65, - 102, - 167, - 21, - 89, - 27, - 240, - 73, - 183, - 83, - 220, - 124, - 26, - 59, - 147, - 212, - 187, - 87, - 122, - 17, - 128, - 24, - 164, - 77, - 174, - 160, - 213, - 132, - 153, - 13, - 95, - 220, - 236, - 109, - 149, - 135, - 108, - 44, - 22, - 190, - 24, - 172, - 176, - 255, - 148, - 212, - 192, - 195, - 70, - 71, - 237, - 61, - 252, - 81, - 233, - 4, - 161, - 54, - 41, - 194, - 61, - 62, - 195, - 148, - 82, - 45, - 104, - 51, - 61, - 60, - 252, - 213, - 250, - 105, - 120, - 64, - 172, - 24, - 205, - 193, - 174, - 12, - 28, - 198, - 25, - 185, - 143, - 63, - 238, - 240, - 190, - 24, - 175, - 61, - 174, - 119, - 23, - 56, - 7, - 174, - 237, - 251, - 48, - 111, - 113, - 35, - 161, - 115, - 122, - 101, - 120, - 47, - 245, - 94, - 123, - 54, - 221, - 208, - 207, - 235, - 140, - 18, - 203, - 101, - 237, - 207, - 187, - 207, - 102, - 172, - 126, - 108, - 164, - 136, - 96, - 194, - 225, - 200, - 116, - 78, - 69, - 97, - 175, - 229, - 53, - 243, - 224, - 247, - 228, - 134, - 46, - 38, - 115, - 198, - 206, - 112, - 239, - 231, - 239, - 134, - 241, - 6, - 100, - 240, - 213, - 66, - 202, - 211, - 95, - 30, - 90, - 179, - 77, - 47, - 173, - 234, - 224, - 106, - 215, - 93, - 148, - 247, - 24, - 147, - 221, - 97, - 23, - 184, - 166, - 135, - 43, - 191, - 248, - 244, - 227, - 208, - 136, - 115, - 26, - 109, - 224, - 139, - 229, - 39, - 43, - 177, - 217, - 138, - 87, - 240, - 140, - 149, - 253, - 140, - 84, - 25, - 110, - 71, - 241, - 188, - 92, - 98, - 71, - 164, - 221, - 28, - 164, - 96, - 53, - 137, - 34, - 206, - 10, - 27, - 136, - 140, - 31, - 230, - 185, - 246, - 48, - 113, - 231, - 206, - 149, - 85, - 80, - 140, - 157, - 85, - 129, - 85, - 246, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ], - "user_modulus_offset": 246, - "user_modulus_tag_offset": 241, - "user_rsa_signature": [ - "670805469181973516875438567386317902", - "595498162979863822930172827552420101", - "2651706331680498788370903284123664612", - "1826944087010016758530633208331324419", - "487628171817999600504751197065680099", - "1761312124121051970041496978413762357", - "1321499792656292377971470801759799072", - "1388501242199356197053590606773374739", - "1556386764739349565208105288639441018", - "380072273813794514748689185532246205", - "390985467406695680705336832371178229", - "2435383271450282984787182027859110802", - "2130346157777457927287311487463603274", - "2415450150986339177588491392447426378", - "632044598692293899896715499941851803", - "1727033236971419281831763807306622317", - "3483877609441698791479200202451634" - ] -} \ No newline at end of file + "actual_issuer_tbs_length": 956, + "actual_user_cert_length": 1492, + "issuer_rsa_modulus": [ + "1807942265592223367154362816422861039", + "2305953632643590616116593108295128755", + "1247496666922256604673024687049014315", + "582586442554820465572123764371146875", + "1911214889398011848293147002496757162", + "1760341856438509097467613130179572105", + "946211305863128728498149364763393529", + "1914270785507881386855757165255221128", + "2355589212739621903625068891028181420", + "1318539479410329602666430738353887327", + "606147831867297661886961942997159211", + "1864624912093997210597657924349861690", + "1056161645998086082529084524681240090", + "342293890805329623678173707944610280", + "2079791287327718906513016340551351061", + "1801207700871859621240269802726961226", + "22607211090886401884722297719612162", + "2415040216350041461666578701187456592", + "796235729849898084108882000090843539", + "2317527332343671675100670741738738015", + "903459836407102545305807494367285825", + "1197991867458093794092433451563936029", + "407701846101408942112311694735795682", + "285871239245410930192393697727176993", + "2100309427878174913807373581846478383", + "609837687574653654775568796596201421", + "476367808746265430460916865536822193", + "2611526023006769961151668235099534774", + "1522360231075168682257981231156150745", + "2284005754286955569252753003738152133", + "628604853518070777015357495459505064", + "2356246750639482851351502309910664046", + "1784413933351700362792618634493692618", + "6906918042249046255978038894271" + ], + "issuer_rsa_signature": [ + "2112822056856181843548726467606971822", + "907742689414871613253808379091320352", + "966649284206692911648911274680194508", + "544448025807853890122692871167631236", + "832028145985696001758985965911211201", + "2397998302648344417513216067123690808", + "1968625008852953489120207238637144002", + "946838927664046607438321029152670002", + "982687931812455301905060846646880201", + "187710940099632809487494290878885722", + "2105161433429457278225546503497870165", + "178690297416334325479246658523040583", + "497884869163963687494894701861101372", + "2379484988214420082352001296017103022", + "2520458492783131907013829449793902347", + "1576776025759342640972734236513553671", + "407991830515808418358279595555599044", + "2149810395086779934405342818659027534", + "1821774300124971683171766597507778609", + "2372609958218075352881677715015945422", + "538296676968054153362025939359042633", + "809661135770462386390063555279646407", + "2338119238124460178571120262649733059", + "1013485245385458324966420211088294708", + "1746501051388139341056151310380541917", + "1483669734599901961202015016496393658", + "2172014725902208889237449011422617888", + "2500620176485614579807919098482727770", + "301919812316122675730350852340347283", + "290227427475568080869991795657810741", + "751828499104580777014585234910779621", + "1435245259736710442881282826558981231", + "716366577730711643937670541406908095", + "1283150059758547922111240485428" + ], + "issuer_tbs": [ + "48", + "130", + "3", + "184", + "160", + "3", + "2", + "1", + "2", + "2", + "17", + "0", + "218", + "76", + "94", + "55", + "16", + "245", + "13", + "35", + "74", + "90", + "10", + "199", + "5", + "145", + "37", + "68", + "48", + "13", + "6", + "9", + "42", + "134", + "72", + "134", + "247", + "13", + "1", + "1", + "11", + "5", + "0", + "48", + "71", + "49", + "11", + "48", + "9", + "6", + "3", + "85", + "4", + "6", + "19", + "2", + "84", + "87", + "49", + "18", + "48", + "16", + "6", + "3", + "85", + "4", + "10", + "12", + "9", + "232", + "161", + "140", + "230", + "148", + "191", + "233", + "153", + "162", + "49", + "36", + "48", + "34", + "6", + "3", + "85", + "4", + "11", + "12", + "27", + "229", + "133", + "167", + "230", + "148", + "191", + "233", + "131", + "168", + "230", + "134", + "145", + "232", + "173", + "137", + "231", + "174", + "161", + "231", + "144", + "134", + "228", + "184", + "173", + "229", + "191", + "131", + "48", + "30", + "23", + "13", + "50", + "54", + "48", + "50", + "48", + "54", + "49", + "48", + "49", + "52", + "53", + "49", + "90", + "23", + "13", + "50", + "55", + "48", + "50", + "48", + "54", + "49", + "53", + "53", + "57", + "53", + "57", + "90", + "48", + "60", + "49", + "11", + "48", + "9", + "6", + "3", + "85", + "4", + "6", + "19", + "2", + "84", + "87", + "49", + "18", + "48", + "16", + "6", + "3", + "85", + "4", + "3", + "12", + "9", + "233", + "132", + "173", + "233", + "155", + "133", + "230", + "150", + "135", + "49", + "25", + "48", + "23", + "6", + "3", + "85", + "4", + "5", + "19", + "16", + "49", + "50", + "48", + "48", + "50", + "50", + "55", + "55", + "50", + "50", + "48", + "48", + "56", + "50", + "49", + "53", + "48", + "130", + "1", + "34", + "48", + "13", + "6", + "9", + "42", + "134", + "72", + "134", + "247", + "13", + "1", + "1", + "1", + "5", + "0", + "3", + "130", + "1", + "15", + "0", + "48", + "130", + "1", + "10", + "2", + "130", + "1", + "1", + "0", + "163", + "140", + "5", + "118", + "55", + "88", + "109", + "167", + "107", + "216", + "120", + "222", + "141", + "153", + "185", + "13", + "202", + "146", + "234", + "181", + "143", + "220", + "250", + "170", + "4", + "200", + "70", + "28", + "102", + "186", + "30", + "32", + "88", + "30", + "36", + "69", + "235", + "173", + "86", + "95", + "189", + "190", + "111", + "205", + "192", + "88", + "62", + "132", + "75", + "243", + "242", + "41", + "33", + "153", + "145", + "19", + "193", + "183", + "23", + "195", + "90", + "77", + "215", + "16", + "185", + "97", + "195", + "32", + "62", + "45", + "160", + "83", + "45", + "78", + "140", + "215", + "79", + "217", + "182", + "43", + "140", + "217", + "110", + "52", + "79", + "106", + "249", + "205", + "189", + "76", + "178", + "123", + "53", + "104", + "91", + "209", + "69", + "58", + "86", + "137", + "183", + "190", + "154", + "123", + "118", + "86", + "113", + "184", + "149", + "0", + "59", + "231", + "149", + "145", + "199", + "154", + "115", + "248", + "110", + "224", + "217", + "46", + "204", + "60", + "59", + "208", + "81", + "110", + "120", + "124", + "81", + "171", + "214", + "141", + "219", + "99", + "30", + "193", + "151", + "197", + "202", + "187", + "233", + "76", + "161", + "53", + "108", + "133", + "177", + "123", + "247", + "154", + "217", + "118", + "119", + "181", + "136", + "3", + "51", + "207", + "177", + "64", + "106", + "108", + "225", + "71", + "117", + "171", + "38", + "163", + "23", + "9", + "187", + "205", + "142", + "6", + "135", + "157", + "22", + "46", + "58", + "212", + "153", + "15", + "191", + "150", + "78", + "234", + "89", + "158", + "56", + "2", + "210", + "15", + "159", + "126", + "217", + "200", + "113", + "20", + "194", + "156", + "150", + "34", + "134", + "238", + "127", + "148", + "210", + "154", + "121", + "133", + "26", + "52", + "225", + "209", + "215", + "60", + "167", + "172", + "153", + "57", + "112", + "84", + "110", + "31", + "11", + "178", + "254", + "188", + "56", + "97", + "162", + "247", + "123", + "193", + "213", + "42", + "105", + "204", + "168", + "182", + "140", + "172", + "218", + "255", + "138", + "37", + "188", + "218", + "57", + "233", + "47", + "105", + "166", + "187", + "2", + "3", + "1", + "0", + "1", + "163", + "130", + "1", + "192", + "48", + "130", + "1", + "188", + "48", + "31", + "6", + "3", + "85", + "29", + "35", + "4", + "24", + "48", + "22", + "128", + "20", + "71", + "32", + "163", + "177", + "38", + "75", + "205", + "109", + "72", + "172", + "242", + "100", + "8", + "134", + "151", + "44", + "116", + "84", + "17", + "95", + "48", + "29", + "6", + "3", + "85", + "29", + "14", + "4", + "22", + "4", + "20", + "186", + "32", + "41", + "162", + "219", + "87", + "207", + "10", + "172", + "182", + "195", + "194", + "8", + "127", + "190", + "209", + "99", + "197", + "227", + "235", + "48", + "14", + "6", + "3", + "85", + "29", + "15", + "1", + "1", + "255", + "4", + "4", + "3", + "2", + "7", + "128", + "48", + "20", + "6", + "3", + "85", + "29", + "32", + "4", + "13", + "48", + "11", + "48", + "9", + "6", + "7", + "96", + "134", + "118", + "101", + "0", + "3", + "3", + "48", + "72", + "6", + "3", + "85", + "29", + "9", + "4", + "65", + "48", + "63", + "48", + "21", + "6", + "7", + "96", + "134", + "118", + "1", + "100", + "2", + "1", + "49", + "10", + "6", + "8", + "96", + "134", + "118", + "1", + "100", + "3", + "1", + "1", + "48", + "19", + "6", + "7", + "96", + "134", + "118", + "1", + "100", + "2", + "2", + "49", + "8", + "19", + "6", + "109", + "111", + "98", + "105", + "108", + "101", + "48", + "17", + "6", + "7", + "96", + "134", + "118", + "1", + "100", + "2", + "51", + "49", + "6", + "12", + "4", + "56", + "51", + "49", + "49", + "48", + "129", + "128", + "6", + "3", + "85", + "29", + "31", + "4", + "121", + "48", + "119", + "48", + "56", + "160", + "54", + "160", + "52", + "134", + "50", + "104", + "116", + "116", + "112", + "58", + "47", + "47", + "99", + "114", + "108", + "45", + "109", + "111", + "105", + "99", + "97", + "46", + "109", + "111", + "105", + "46", + "103", + "111", + "118", + "46", + "116", + "119", + "47", + "99", + "114", + "108", + "47", + "77", + "79", + "73", + "67", + "65", + "45", + "71", + "51", + "45", + "49", + "48", + "45", + "51", + "49", + "46", + "99", + "114", + "108", + "48", + "59", + "160", + "57", + "160", + "55", + "134", + "53", + "104", + "116", + "116", + "112", + "58", + "47", + "47", + "99", + "114", + "108", + "45", + "109", + "111", + "105", + "99", + "97", + "46", + "109", + "111", + "105", + "46", + "103", + "111", + "118", + "46", + "116", + "119", + "47", + "99", + "114", + "108", + "47", + "77", + "79", + "73", + "67", + "65", + "45", + "71", + "51", + "45", + "99", + "111", + "109", + "112", + "108", + "101", + "116", + "101", + "46", + "99", + "114", + "108", + "48", + "129", + "134", + "6", + "8", + "43", + "6", + "1", + "5", + "5", + "7", + "1", + "1", + "4", + "122", + "48", + "120", + "48", + "71", + "6", + "8", + "43", + "6", + "1", + "5", + "5", + "7", + "48", + "2", + "134", + "59", + "104", + "116", + "116", + "112", + "58", + "47", + "47", + "109", + "111", + "105", + "99", + "97", + "46", + "110", + "97", + "116", + "46", + "103", + "111", + "118", + "46", + "116", + "119", + "47", + "114", + "101", + "112", + "111", + "115", + "105", + "116", + "111", + "114", + "121", + "47", + "67", + "101", + "114", + "116", + "115", + "47", + "73", + "115", + "115", + "117", + "101", + "100", + "84", + "111", + "84", + "104", + "105", + "115", + "67", + "65", + "46", + "112", + "55", + "98", + "48", + "45", + "6", + "8", + "43", + "6", + "1", + "5", + "5", + "7", + "48", + "1", + "134", + "33", + "104", + "116", + "116", + "112", + "58", + "47", + "47", + "111", + "99", + "115", + "112", + "45", + "109", + "111", + "105", + "99", + "97", + "46", + "109", + "111", + "105", + "46", + "103", + "111", + "118", + "46", + "116", + "119", + "47", + "79", + "67", + "83", + "80", + "128", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "29", + "224", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "issuer_tbs_length": 1024, + "serialNumber": "290168228551659997759061707237914387780", + "serial_number_offset": 15, + "smtIsOld0": "1", + "smtOldKey": "0", + "smtOldValue": "0", + "smtRoot": "0", + "smtSiblings": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "subject_dn": [ + 48, 60, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 84, 87, 49, 18, 48, 16, 6, + 3, 85, 4, 3, 12, 9, 233, 132, 173, 233, 155, 133, 230, 150, 135, 49, 25, + 48, 23, 6, 3, 85, 4, 5, 19, 16, 49, 50, 48, 48, 50, 50, 55, 55, 50, 50, + 48, 48, 56, 50, 49, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 + ], + "subject_dn_length": 62, + "subject_dn_offset": 152, + "tbs": [ + "101", + "55", + "55", + "53", + "102", + "50", + "56", + "48", + "53", + "102", + "98", + "57", + "57", + "51", + "101", + "48", + "53", + "97", + "50", + "48", + "56", + "100", + "98", + "102", + "102", + "49", + "53", + "100", + "49", + "99", + "49", + "128", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "248", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "tbs_length": 64, + "user_cert_zero_padded": [ + 48, 130, 5, 208, 48, 130, 3, 184, 160, 3, 2, 1, 2, 2, 17, 0, 218, 76, + 94, 55, 16, 245, 13, 35, 74, 90, 10, 199, 5, 145, 37, 68, 48, 13, 6, 9, + 42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 48, 71, 49, 11, 48, 9, 6, 3, + 85, 4, 6, 19, 2, 84, 87, 49, 18, 48, 16, 6, 3, 85, 4, 10, 12, 9, 232, + 161, 140, 230, 148, 191, 233, 153, 162, 49, 36, 48, 34, 6, 3, 85, 4, 11, + 12, 27, 229, 133, 167, 230, 148, 191, 233, 131, 168, 230, 134, 145, 232, + 173, 137, 231, 174, 161, 231, 144, 134, 228, 184, 173, 229, 191, 131, + 48, 30, 23, 13, 50, 54, 48, 50, 48, 54, 49, 48, 49, 52, 53, 49, 90, 23, + 13, 50, 55, 48, 50, 48, 54, 49, 53, 53, 57, 53, 57, 90, 48, 60, 49, 11, + 48, 9, 6, 3, 85, 4, 6, 19, 2, 84, 87, 49, 18, 48, 16, 6, 3, 85, 4, 3, + 12, 9, 233, 132, 173, 233, 155, 133, 230, 150, 135, 49, 25, 48, 23, 6, + 3, 85, 4, 5, 19, 16, 49, 50, 48, 48, 50, 50, 55, 55, 50, 50, 48, 48, 56, + 50, 49, 53, 48, 130, 1, 34, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, + 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0, 163, 140, + 5, 118, 55, 88, 109, 167, 107, 216, 120, 222, 141, 153, 185, 13, 202, + 146, 234, 181, 143, 220, 250, 170, 4, 200, 70, 28, 102, 186, 30, 32, 88, + 30, 36, 69, 235, 173, 86, 95, 189, 190, 111, 205, 192, 88, 62, 132, 75, + 243, 242, 41, 33, 153, 145, 19, 193, 183, 23, 195, 90, 77, 215, 16, 185, + 97, 195, 32, 62, 45, 160, 83, 45, 78, 140, 215, 79, 217, 182, 43, 140, + 217, 110, 52, 79, 106, 249, 205, 189, 76, 178, 123, 53, 104, 91, 209, + 69, 58, 86, 137, 183, 190, 154, 123, 118, 86, 113, 184, 149, 0, 59, 231, + 149, 145, 199, 154, 115, 248, 110, 224, 217, 46, 204, 60, 59, 208, 81, + 110, 120, 124, 81, 171, 214, 141, 219, 99, 30, 193, 151, 197, 202, 187, + 233, 76, 161, 53, 108, 133, 177, 123, 247, 154, 217, 118, 119, 181, 136, + 3, 51, 207, 177, 64, 106, 108, 225, 71, 117, 171, 38, 163, 23, 9, 187, + 205, 142, 6, 135, 157, 22, 46, 58, 212, 153, 15, 191, 150, 78, 234, 89, + 158, 56, 2, 210, 15, 159, 126, 217, 200, 113, 20, 194, 156, 150, 34, + 134, 238, 127, 148, 210, 154, 121, 133, 26, 52, 225, 209, 215, 60, 167, + 172, 153, 57, 112, 84, 110, 31, 11, 178, 254, 188, 56, 97, 162, 247, + 123, 193, 213, 42, 105, 204, 168, 182, 140, 172, 218, 255, 138, 37, 188, + 218, 57, 233, 47, 105, 166, 187, 2, 3, 1, 0, 1, 163, 130, 1, 192, 48, + 130, 1, 188, 48, 31, 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 71, 32, + 163, 177, 38, 75, 205, 109, 72, 172, 242, 100, 8, 134, 151, 44, 116, 84, + 17, 95, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 186, 32, 41, 162, 219, + 87, 207, 10, 172, 182, 195, 194, 8, 127, 190, 209, 99, 197, 227, 235, + 48, 14, 6, 3, 85, 29, 15, 1, 1, 255, 4, 4, 3, 2, 7, 128, 48, 20, 6, 3, + 85, 29, 32, 4, 13, 48, 11, 48, 9, 6, 7, 96, 134, 118, 101, 0, 3, 3, 48, + 72, 6, 3, 85, 29, 9, 4, 65, 48, 63, 48, 21, 6, 7, 96, 134, 118, 1, 100, + 2, 1, 49, 10, 6, 8, 96, 134, 118, 1, 100, 3, 1, 1, 48, 19, 6, 7, 96, + 134, 118, 1, 100, 2, 2, 49, 8, 19, 6, 109, 111, 98, 105, 108, 101, 48, + 17, 6, 7, 96, 134, 118, 1, 100, 2, 51, 49, 6, 12, 4, 56, 51, 49, 49, 48, + 129, 128, 6, 3, 85, 29, 31, 4, 121, 48, 119, 48, 56, 160, 54, 160, 52, + 134, 50, 104, 116, 116, 112, 58, 47, 47, 99, 114, 108, 45, 109, 111, + 105, 99, 97, 46, 109, 111, 105, 46, 103, 111, 118, 46, 116, 119, 47, 99, + 114, 108, 47, 77, 79, 73, 67, 65, 45, 71, 51, 45, 49, 48, 45, 51, 49, + 46, 99, 114, 108, 48, 59, 160, 57, 160, 55, 134, 53, 104, 116, 116, 112, + 58, 47, 47, 99, 114, 108, 45, 109, 111, 105, 99, 97, 46, 109, 111, 105, + 46, 103, 111, 118, 46, 116, 119, 47, 99, 114, 108, 47, 77, 79, 73, 67, + 65, 45, 71, 51, 45, 99, 111, 109, 112, 108, 101, 116, 101, 46, 99, 114, + 108, 48, 129, 134, 6, 8, 43, 6, 1, 5, 5, 7, 1, 1, 4, 122, 48, 120, 48, + 71, 6, 8, 43, 6, 1, 5, 5, 7, 48, 2, 134, 59, 104, 116, 116, 112, 58, 47, + 47, 109, 111, 105, 99, 97, 46, 110, 97, 116, 46, 103, 111, 118, 46, 116, + 119, 47, 114, 101, 112, 111, 115, 105, 116, 111, 114, 121, 47, 67, 101, + 114, 116, 115, 47, 73, 115, 115, 117, 101, 100, 84, 111, 84, 104, 105, + 115, 67, 65, 46, 112, 55, 98, 48, 45, 6, 8, 43, 6, 1, 5, 5, 7, 48, 1, + 134, 33, 104, 116, 116, 112, 58, 47, 47, 111, 99, 115, 112, 45, 109, + 111, 105, 99, 97, 46, 109, 111, 105, 46, 103, 111, 118, 46, 116, 119, + 47, 79, 67, 83, 80, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11, + 5, 0, 3, 130, 2, 1, 0, 32, 100, 41, 180, 113, 131, 34, 202, 145, 168, + 20, 116, 104, 137, 247, 153, 100, 67, 206, 97, 68, 43, 247, 241, 241, + 116, 46, 191, 138, 53, 134, 255, 156, 107, 180, 177, 231, 33, 8, 133, + 13, 162, 55, 164, 51, 0, 113, 6, 9, 162, 139, 65, 54, 0, 236, 181, 166, + 57, 70, 252, 170, 36, 110, 221, 193, 20, 255, 54, 212, 110, 222, 4, 102, + 163, 162, 92, 188, 135, 216, 186, 98, 151, 113, 182, 157, 193, 39, 25, + 63, 12, 208, 191, 126, 30, 165, 143, 13, 207, 192, 190, 65, 232, 218, + 214, 137, 66, 96, 46, 87, 241, 79, 126, 39, 138, 180, 145, 131, 132, + 130, 59, 125, 33, 152, 169, 120, 69, 53, 18, 232, 68, 192, 39, 219, 117, + 80, 93, 38, 103, 231, 191, 122, 167, 40, 222, 253, 17, 251, 167, 221, + 97, 152, 87, 26, 213, 179, 17, 214, 233, 56, 59, 43, 190, 129, 154, 112, + 147, 139, 111, 79, 115, 204, 93, 179, 181, 16, 140, 146, 247, 240, 211, + 125, 236, 8, 112, 223, 183, 198, 195, 252, 64, 148, 249, 157, 216, 230, + 122, 193, 52, 48, 219, 27, 216, 239, 63, 48, 62, 55, 208, 196, 158, 71, + 149, 158, 163, 225, 237, 128, 219, 11, 19, 46, 114, 58, 102, 117, 123, + 113, 161, 129, 26, 243, 14, 41, 52, 249, 239, 69, 154, 32, 199, 60, 19, + 171, 250, 113, 127, 133, 62, 238, 75, 74, 40, 74, 148, 156, 78, 147, + 140, 224, 58, 178, 140, 131, 130, 105, 121, 164, 164, 178, 196, 151, + 214, 135, 180, 63, 69, 82, 208, 127, 63, 28, 163, 128, 38, 131, 249, 91, + 12, 172, 57, 181, 62, 104, 20, 90, 253, 159, 36, 229, 194, 249, 72, 181, + 93, 15, 254, 2, 203, 230, 231, 128, 4, 131, 115, 21, 197, 254, 57, 232, + 152, 254, 231, 132, 146, 132, 142, 170, 222, 53, 243, 193, 19, 80, 229, + 23, 81, 2, 78, 68, 221, 13, 89, 190, 24, 90, 62, 85, 193, 227, 116, 236, + 192, 200, 3, 81, 197, 204, 242, 41, 173, 84, 72, 77, 186, 78, 221, 9, + 180, 55, 199, 134, 111, 125, 195, 222, 180, 189, 66, 65, 118, 137, 24, + 60, 39, 236, 39, 46, 27, 116, 103, 201, 91, 45, 97, 181, 103, 25, 85, + 228, 230, 98, 107, 55, 139, 64, 153, 94, 201, 45, 57, 225, 140, 132, + 167, 22, 172, 73, 164, 130, 113, 240, 185, 186, 206, 57, 54, 184, 230, + 221, 92, 43, 32, 88, 218, 71, 167, 10, 3, 226, 121, 246, 28, 237, 96, + 27, 106, 84, 236, 48, 143, 204, 19, 70, 218, 225, 153, 24, 55, 181, 45, + 171, 93, 0, 177, 154, 252, 34, 232, 173, 245, 20, 104, 38, 229, 18, 100, + 139, 181, 149, 172, 87, 49, 93, 166, 87, 7, 157, 115, 215, 72, 178, 54, + 197, 159, 42, 252, 65, 150, 234, 43, 134, 133, 216, 40, 41, 235, 62, + 221, 217, 253, 133, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 + ], + "user_modulus_offset": 247, + "user_modulus_tag_offset": 242, + "user_rsa_signature": [ + "2656563551858478367085857598280693616", + "1135279320238834367874260153401495634", + "1236154667558388398859842442878269008", + "13979791021677235185625809896317620", + "366648307978239886325848295735487586", + "2450082966714864465032474198296762214", + "2427315231249502076342515503345057650", + "1947442548394582566761316146931490920", + "1207098675504504115883444760218274532", + "1096097913774784516739078218725380470", + "46562945591360126741076961461887727", + "1190337605897152816523231684532143416", + "1062876616288492608278608591157023706", + "2131471373718090553671774971922491487", + "726914424324709412373665782565198850", + "2143853404691277036782734877302293438", + "1349685527254192381317565303065343", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ] +} diff --git a/README.md b/README.md index 57b791c..cd58837 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # OpenAC Example App -Sample iOS app that runs the **OpenAC** zero-knowledge pipeline for the RS256 circuit: download the circuit, set up keys, generate a proof, and verify it. It uses **[OpenACSwift](https://github.com/zkmopro/OpenACSwift)**—Swift bindings for OpenAC on iOS. +Sample iOS app that runs the **OpenAC** zero-knowledge pipeline for the SHA256RSA4096 circuit: download the circuit, set up keys, generate a proof, and verify it. It uses **[OpenACSwift](https://github.com/zkmopro/OpenACSwift)**—Swift bindings for OpenAC on iOS. ## Screenshot @@ -18,13 +18,13 @@ Match the environment expected by [OpenACSwift](https://github.com/zkmopro/OpenA ## Dependencies - [OpenACSwift](https://github.com/zkmopro/OpenACSwift) (Swift Package Manager) -- [ZIPFoundation](https://github.com/weichsel/ZIPFoundation) — used to extract the downloaded `rs256.r1cs` archive +- [ZIPFoundation](https://github.com/weichsel/ZIPFoundation) — used to extract the downloaded `sha256rsa4096.r1cs` archive ## Running the project 1. Open `OpenACExampleApp.xcodeproj` in Xcode. 2. Select an iPhone simulator or device. -3. Build and run. On first use, tap **Download Circuit** if the large `rs256.r1cs` file is not present yet, then run the pipeline (play control) to execute setup, prove, and verify. +3. Build and run. On first use, tap **Download Circuit** if the large `sha256rsa4096.r1cs` file is not present yet, then run the pipeline (play control) to execute setup, prove, and verify. Bundled `input.json` is copied into the app’s documents area on first launch for use with `setupKeys` and `prove`, as described in the OpenACSwift README.