From 1599a01659523573fe0bb062c6f68049a99aeddb Mon Sep 17 00:00:00 2001 From: Raul Metsma Date: Thu, 20 Mar 2025 19:27:09 +0200 Subject: [PATCH 1/4] Merge error info Signed-off-by: Raul Metsma --- MoppApp/MoppApp/ContainerActions.swift | 8 +- MoppApp/MoppApp/ContainerViewController.swift | 4 +- MoppApp/MoppApp/CryptoActions.swift | 2 +- .../MoppApp/Extensions/String+Additions.swift | 20 +- MoppApp/MoppApp/IdCardViewController.swift | 14 +- MoppApp/MoppApp/MobileIDSignature.swift | 2 +- .../MyeIDChangeCodesViewController.swift | 19 +- MoppApp/MoppApp/MyeIDViewController.swift | 53 +- MoppApp/MoppApp/NFCSignature.swift | 2 +- MoppApp/MoppApp/SigningActions.swift | 23 +- .../SigningContainerViewController.swift | 8 +- MoppApp/MoppApp/SmartIDSignature.swift | 2 +- MoppLib/MoppLib.xcodeproj/project.pbxproj | 38 +- MoppLib/MoppLib/MoppLibDigidocManager.h | 3 +- MoppLib/MoppLib/MoppLibDigidocManager.mm | 29 +- .../PublicInterface/MoppLibConstants.h | 37 - .../PublicInterface/MoppLibConstants.m | 26 - .../{ => PublicInterface}/MoppLibError.swift | 60 +- .../MoppLib/PublicInterface/MoppLibManager.h | 3 +- .../MoppLib/PublicInterface/MoppLibManager.m | 6 +- .../PublicInterface/MoppLibPersonalData.swift | 14 +- MoppLib/MoppLib/TSL cache/EE.xml | 2607 ----------------- MoppLib/MoppLib/TSL cache/FI.xml | 333 --- MoppLib/MoppLib/TSL cache/tl-mp.xml | 2135 -------------- 24 files changed, 111 insertions(+), 5337 deletions(-) delete mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibConstants.m rename MoppLib/MoppLib/{ => PublicInterface}/MoppLibError.swift (65%) delete mode 100644 MoppLib/MoppLib/TSL cache/EE.xml delete mode 100644 MoppLib/MoppLib/TSL cache/FI.xml delete mode 100644 MoppLib/MoppLib/TSL cache/tl-mp.xml diff --git a/MoppApp/MoppApp/ContainerActions.swift b/MoppApp/MoppApp/ContainerActions.swift index bab5a5230..055b7e3cc 100644 --- a/MoppApp/MoppApp/ContainerActions.swift +++ b/MoppApp/MoppApp/ContainerActions.swift @@ -143,13 +143,13 @@ extension ContainerActions where Self: UIViewController { return } - if err?.code == 10018 && (url.lastPathComponent.hasSuffix(ContainerFormatDdoc) || url.lastPathComponent.hasSuffix(ContainerFormatPDF)) { - + if err?.code == MoppLibErrorCode.moppLibErrorNoInternetConnection.rawValue && (url.lastPathComponent.hasSuffix(ContainerFormatDdoc) || url.lastPathComponent.hasSuffix(ContainerFormatPDF)) { + let alert = AlertUtil.messageAlert(message: L(.noConnectionMessage), alertAction: nil) navController?.viewControllers.last!.present(alert, animated: true) return - } else if err?.code == 10027 { + } else if err?.code == MoppLibErrorCode.moppLibErrorSslHandshakeFailed.rawValue { let alert = AlertUtil.messageAlert(message: L(.sslHandshakeMessage), alertAction: nil) navController?.viewControllers.last!.present(alert, animated: true) @@ -274,7 +274,7 @@ extension ContainerActions where Self: UIViewController { failure: { error in landingViewController.importProgressViewController.dismissRecursively(animated: false, completion: { [weak self] in guard let nsError = error as NSError? else { return } - if nsError.code == Int(MoppLibErrorCode.moppLibErrorDuplicatedFilename.rawValue) { + if nsError.code == MoppLibErrorCode.moppLibErrorDuplicatedFilename.rawValue { DispatchQueue.main.async { self?.infoAlert(message: L(.containerDetailsFileAlreadyExists)) } diff --git a/MoppApp/MoppApp/ContainerViewController.swift b/MoppApp/MoppApp/ContainerViewController.swift index c20c0d3d7..0319fc40a 100644 --- a/MoppApp/MoppApp/ContainerViewController.swift +++ b/MoppApp/MoppApp/ContainerViewController.swift @@ -772,7 +772,7 @@ extension ContainerViewController : UITableViewDataSource { return } - if nsError.code == 10027 { + if nsError.code == MoppLibErrorCode.moppLibErrorSslHandshakeFailed.rawValue { let alert = AlertUtil.messageAlert(message: L(.sslHandshakeMessage), alertAction: nil) self.navigationController?.popViewController(animated: true) self.navigationController?.viewControllers.last!.present(alert, animated: true) @@ -788,7 +788,7 @@ extension ContainerViewController : UITableViewDataSource { } failure: { error in printLog("Unable to get file from container \(error?.localizedDescription ?? "Unable to get error description")") let nserror = error as NSError? - if nserror != nil && nserror?.code == Int(MoppLibErrorCode.moppLibErrorNoInternetConnection.rawValue) { + if nserror != nil && nserror?.code == MoppLibErrorCode.moppLibErrorNoInternetConnection.rawValue { let pathExtension = URL(string: containerFilePath)?.pathExtension let asicContainer: MoppLibContainer? = self.containerViewDelegate?.getContainer() if (pathExtension == "asics" || pathExtension == "scs") && !ContainerViewController.isXades(signatures: asicContainer?.signatures ?? []) { diff --git a/MoppApp/MoppApp/CryptoActions.swift b/MoppApp/MoppApp/CryptoActions.swift index dd535ceb9..29ca969f9 100644 --- a/MoppApp/MoppApp/CryptoActions.swift +++ b/MoppApp/MoppApp/CryptoActions.swift @@ -108,7 +108,7 @@ extension CryptoContainerViewController : IdCardDecryptViewControllerDelegate { } else { self.dismiss(animated: false) guard let nsError = error as NSError? else { return } - if nsError.code == Int(MoppLibErrorCode.moppLibErrorPinBlocked.rawValue) { + if nsError.code == MoppLibErrorCode.moppLibErrorPinBlocked.rawValue { errorAlertWithLink(message: L(.pin1BlockedAlert)) } else { infoAlert(message: L(.decryptionErrorMessage)) diff --git a/MoppApp/MoppApp/Extensions/String+Additions.swift b/MoppApp/MoppApp/Extensions/String+Additions.swift index 070d080b4..0903c67ed 100644 --- a/MoppApp/MoppApp/Extensions/String+Additions.swift +++ b/MoppApp/MoppApp/Extensions/String+Additions.swift @@ -219,9 +219,25 @@ extension String { } func sanitize() -> String { - let normalizedName = FileUtil.getFileName(currentFileName: self) - return MoppLibManager.sanitize(normalizedName) + var normalizedName = FileUtil.getFileName(currentFileName: self) .removeForbiddenCharacters().trimWhitespacesAndNewlines() + + var characterSet = CharacterSet.illegalCharacters + characterSet.insert(charactersIn: "@%:^?[]'\"”’{}#&`\\~«»/´") + let rtlChars = ["\u{200E}", "\u{200F}", "\u{202E}", "\u{202A}", "\u{202B}"] + for rtlChar in rtlChars { + characterSet.insert(charactersIn: rtlChar) + } + + while normalizedName.hasPrefix(".") { + if normalizedName.count > 1 { + normalizedName.removeFirst() + } else { + normalizedName = normalizedName.replacingOccurrences(of: ".", with: "_") + } + } + + return normalizedName.components(separatedBy: characterSet).joined() } func lowercasedStart() -> String { diff --git a/MoppApp/MoppApp/IdCardViewController.swift b/MoppApp/MoppApp/IdCardViewController.swift index 206f7a5b6..6a382af86 100644 --- a/MoppApp/MoppApp/IdCardViewController.swift +++ b/MoppApp/MoppApp/IdCardViewController.swift @@ -291,7 +291,7 @@ class IdCardViewController : MoppViewController, TokenFlowSigning { case .readyForTokenAction: // Give VoiceOver time to announce "ID-card found" DispatchQueue.main.asyncAfter(deadline: .now() + 2.5) { - let fullname = self.idCardPersonalData?.fullName() ?? String() + let fullname = self.idCardPersonalData?.fullName ?? String() let personalCode = self.idCardPersonalData?.personalIdentificationCode ?? String() if self.isActionDecryption { self.titleLabel.text = L(.cardReaderStateReadyForPin1, [fullname, personalCode]) @@ -340,7 +340,7 @@ class IdCardViewController : MoppViewController, TokenFlowSigning { UIAccessibility.post(notification: UIAccessibility.Notification.layoutChanged, argument: titleLabel) } case .wrongPin: - let fullname = idCardPersonalData?.fullName() ?? String() + let fullname = idCardPersonalData?.fullName ?? String() let personalCode = idCardPersonalData?.personalIdentificationCode ?? String() if isActionDecryption { titleLabel.text = L(.cardReaderStateReadyForPin1, [fullname, personalCode]) @@ -444,9 +444,9 @@ class IdCardViewController : MoppViewController, TokenFlowSigning { }, failure: { [weak self] error in guard let nsError = error as NSError? else { return } - if nsError.code == Int(MoppLibErrorCode.moppLibErrorWrongPin.rawValue) { // Wrong PIN1 error + if nsError.code == MoppLibErrorCode.moppLibErrorWrongPin.rawValue { DispatchQueue.main.async { - self?.pinAttemptsLeft = (nsError.userInfo[kMoppLibUserInfoRetryCount] as? NSNumber)?.uintValue ?? 0 + self?.pinAttemptsLeft = (nsError.userInfo[MoppLibError.kMoppLibUserInfoRetryCount] as? NSNumber)?.uintValue ?? 0 self?.state = .wrongPin } } else { @@ -506,9 +506,9 @@ class IdCardViewController : MoppViewController, TokenFlowSigning { }) } case .failure(let error): - if error.code == Int(MoppLibErrorCode.moppLibErrorWrongPin.rawValue) { // Wrong PIN2 error + if error.code == MoppLibErrorCode.moppLibErrorWrongPin.rawValue { DispatchQueue.main.async { - self?.pinAttemptsLeft = (error.userInfo[kMoppLibUserInfoRetryCount] as? NSNumber)?.uintValue ?? 0 + self?.pinAttemptsLeft = (error.userInfo[MoppLibError.kMoppLibUserInfoRetryCount] as? NSNumber)?.uintValue ?? 0 self?.state = .wrongPin } } else { @@ -579,7 +579,7 @@ extension IdCardViewController : MoppLibCardReaderManagerDelegate { }, failure: { [weak self] error in DispatchQueue.main.async { guard let error = error as NSError? else { self?.state = .readerProcessFailed; return } - if error.code == 10026 { + if error.code == MoppLibErrorCode.moppLibErrorReaderProcessFailed.rawValue { self?.state = .readerProcessFailed return } diff --git a/MoppApp/MoppApp/MobileIDSignature.swift b/MoppApp/MoppApp/MobileIDSignature.swift index 3f24c8ca7..33d7d0c97 100644 --- a/MoppApp/MoppApp/MobileIDSignature.swift +++ b/MoppApp/MoppApp/MobileIDSignature.swift @@ -236,7 +236,7 @@ class MobileIDSignature { "\tCert: \(cert)\n" + "\tSignature value: \(signatureValue)\n" ) - MoppLibManager.isSignatureValid(cert, signatureValue: signatureValue, success: { (_) in + MoppLibManager.isSignatureValid(cert, signatureValue: signatureValue, success: { printLog("\nRIA.MobileID - Successfully validated signature!\n") DispatchQueue.main.async { NotificationCenter.default.post( diff --git a/MoppApp/MoppApp/MyeIDChangeCodesViewController.swift b/MoppApp/MoppApp/MyeIDChangeCodesViewController.swift index f6017493f..aee86dcf5 100644 --- a/MoppApp/MoppApp/MyeIDChangeCodesViewController.swift +++ b/MoppApp/MoppApp/MyeIDChangeCodesViewController.swift @@ -78,24 +78,13 @@ extension MyeIDChangeCodesViewController: MyeIDChangeCodesViewControllerUIDelega var errorMessage = L(.genericErrorMessage) if let nsError = error as NSError? { let actionType = strongSelf.model.actionType - var errorCode = nsError.code - - let retryCount = (nsError.userInfo[kMoppLibUserInfoRetryCount] as? NSNumber)?.intValue ?? 0 - if errorCode == MoppLibErrorCode.moppLibErrorWrongPin.rawValue && retryCount == 0 { - errorCode = MoppLibErrorCode.moppLibErrorPinBlocked.rawValue - } + let errorCode = nsError.code if errorCode == MoppLibErrorCode.moppLibErrorWrongPin.rawValue { - let retryCount = (nsError.userInfo[kMoppLibUserInfoRetryCount] as? NSNumber)?.intValue ?? 0 + let retryCount = (nsError.userInfo[MoppLibError.kMoppLibUserInfoRetryCount] as? NSNumber)?.intValue ?? 0 strongSelf.infoManager.retryCounts.setRetryCount(for: actionType, with: retryCount) - if retryCount == 1 { - errorMessage = L(.myEidWrongCodeMessageSingular, [actionType.codeDisplayNameForWrongOrBlocked]) - showErrorInline = true - } - else { - errorMessage = L(.myEidWrongCodeMessage, [actionType.codeDisplayNameForWrongOrBlocked]) - showErrorInline = true - } + errorMessage = L(retryCount == 1 ? .myEidWrongCodeMessageSingular : .myEidWrongCodeMessage, [actionType.codeDisplayNameForWrongOrBlocked]) + showErrorInline = true ui.setViewBorder(view: ui.firstCodeTextField) } else if errorCode == MoppLibErrorCode.moppLibErrorPinBlocked.rawValue { diff --git a/MoppApp/MoppApp/MyeIDViewController.swift b/MoppApp/MoppApp/MyeIDViewController.swift index e3ce8f387..f155d8ad5 100644 --- a/MoppApp/MoppApp/MyeIDViewController.swift +++ b/MoppApp/MoppApp/MyeIDViewController.swift @@ -126,57 +126,24 @@ class MyeIDViewController : MoppViewController { extension MyeIDViewController: MoppLibCardReaderManagerDelegate { func moppLibCardReaderStatusDidChange(_ readerStatus: MoppLibCardReaderStatus) { + popChangeCodesViewControllerIfPushed() + var statusVC = children.first as? MyeIDStatusViewController + if statusVC == nil { + statusVC = showViewController(createStatusViewController()) as? MyeIDStatusViewController + } switch readerStatus { - case .Initial: - popChangeCodesViewControllerIfPushed() - var statusVC = children.first as? MyeIDStatusViewController - if statusVC == nil { - statusVC = showViewController(createStatusViewController()) as? MyeIDStatusViewController - } - statusVC?.state = .initial - case .ReaderNotConnected: - popChangeCodesViewControllerIfPushed() - var statusVC = children.first as? MyeIDStatusViewController - if statusVC == nil { - statusVC = showViewController(createStatusViewController()) as? MyeIDStatusViewController - } - statusVC?.state = .readerNotFound - case .ReaderRestarted: - popChangeCodesViewControllerIfPushed() - var statusVC = children.first as? MyeIDStatusViewController - if statusVC == nil { - statusVC = showViewController(createStatusViewController()) as? MyeIDStatusViewController - } - statusVC?.state = .readerRestarted - case .ReaderConnected: - popChangeCodesViewControllerIfPushed() - var statusVC = children.first as? MyeIDStatusViewController - if statusVC == nil { - statusVC = showViewController(createStatusViewController()) as? MyeIDStatusViewController - } - statusVC?.state = .idCardNotFound + case .Initial: statusVC?.state = .initial + case .ReaderNotConnected: statusVC?.state = .readerNotFound + case .ReaderRestarted: statusVC?.state = .readerRestarted + case .ReaderConnected: statusVC?.state = .idCardNotFound case .CardConnected: - popChangeCodesViewControllerIfPushed() - var statusVC = children.first as? MyeIDStatusViewController - if statusVC == nil { - statusVC = showViewController(createStatusViewController()) as? MyeIDStatusViewController - } statusVC?.state = .requestingData - // Give some time for status textfield to update before executing data requests DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: { [weak self] in guard let strongSelf = self else { return } strongSelf.infoManager.requestInformation(with: strongSelf) }) - case .ReaderProcessFailed: - popChangeCodesViewControllerIfPushed() - var statusVC = children.first as? MyeIDStatusViewController - if statusVC == nil { - statusVC = showViewController(createStatusViewController()) as? MyeIDStatusViewController - } - statusVC?.state = .readerProcessFailed - @unknown default: - break + case .ReaderProcessFailed: statusVC?.state = .readerProcessFailed } } } diff --git a/MoppApp/MoppApp/NFCSignature.swift b/MoppApp/MoppApp/NFCSignature.swift index 8cf7f108c..a57c14e96 100644 --- a/MoppApp/MoppApp/NFCSignature.swift +++ b/MoppApp/MoppApp/NFCSignature.swift @@ -180,7 +180,7 @@ class NFCSignature : NSObject, NFCTagReaderSessionDelegate { _ = try await sendWrapped(tag: tag, cls: 0x00, ins: 0x20, p1: 0x00, p2: 0x85, data: pin) let signatureValue = try await sendWrapped(tag: tag, cls:0x00, ins: 0x2A, p1: 0x9E, p2: 0x9A, data: Bytes(hash), le: 256); printLog("\nRIA.NFC - Validating signature...\n") - MoppLibManager.isSignatureValid(cert, signatureValue: signatureValue, success: { _ in + MoppLibManager.isSignatureValid(cert, signatureValue: signatureValue, success: { printLog("\nRIA.NFC - Successfully validated signature!\n") DispatchQueue.main.asyncAfter(deadline: .now() + 1) { NotificationCenter.default.post( diff --git a/MoppApp/MoppApp/SigningActions.swift b/MoppApp/MoppApp/SigningActions.swift index 76794b9b9..08eaf723c 100644 --- a/MoppApp/MoppApp/SigningActions.swift +++ b/MoppApp/MoppApp/SigningActions.swift @@ -200,28 +200,25 @@ extension SigningContainerViewController : IdCardSignViewControllerDelegate { userInfo: nil) } else { guard let nsError = error as NSError? else { return } - if nsError.code == Int(MoppLibErrorCode.moppLibErrorPinBlocked.rawValue) { + switch nsError.code { + case MoppLibErrorCode.moppLibErrorPinBlocked.rawValue: ErrorUtil.generateError(signingError: L(.pin2BlockedAlert)) - } else if nsError.code == Int(MoppLibErrorCode.moppLibErrorTooManyRequests.rawValue) { + case MoppLibErrorCode.moppLibErrorTooManyRequests.rawValue: ErrorUtil.generateError(signingError: .tooManyRequests(signingMethod: SigningType.idCard.rawValue)) - } else if nsError.code == Int(MoppLibErrorCode.moppLibErrorNoInternetConnection.rawValue) { + case MoppLibErrorCode.moppLibErrorNoInternetConnection.rawValue: ErrorUtil.generateError(signingError: .noResponseError) - } else if nsError.code == Int(MoppLibErrorCode.moppLibErrorOCSPTimeSlot.rawValue) { + case MoppLibErrorCode.moppLibErrorOCSPTimeSlot.rawValue: ErrorUtil.generateError(signingError: .ocspInvalidTimeSlot) - } else if nsError.code == Int(MoppLibErrorCode.moppLibErrorSslHandshakeFailed.rawValue) { + case MoppLibErrorCode.moppLibErrorSslHandshakeFailed.rawValue: ErrorUtil.generateError(signingError: .invalidSSLCert) - } else if nsError.code == Int(MoppLibErrorCode.moppLibErrorInvalidProxySettings.rawValue) { + case MoppLibErrorCode.moppLibErrorInvalidProxySettings.rawValue: ErrorUtil.generateError(signingError: .invalidProxySettings) - } else { + default: ErrorUtil.generateError(signingError: .empty, details: MessageUtil.errorMessageWithDetails(details: nsError.localizedDescription)) } } - } else { - if let error = error as? IdCardActionError { - if error == .actionCancelled { - ErrorUtil.generateError(signingError: L(.signingAbortedMessage)) - } - } + } else if let error = error as? IdCardActionError, error == .actionCancelled { + ErrorUtil.generateError(signingError: L(.signingAbortedMessage)) } } } diff --git a/MoppApp/MoppApp/SigningContainerViewController.swift b/MoppApp/MoppApp/SigningContainerViewController.swift index dc417fa2d..2f5766ac2 100644 --- a/MoppApp/MoppApp/SigningContainerViewController.swift +++ b/MoppApp/MoppApp/SigningContainerViewController.swift @@ -306,12 +306,14 @@ extension SigningContainerViewController : ContainerViewControllerDelegate { let nserror = error! as NSError var message = nserror.domain - if nserror.code == Int(MoppLibErrorCode.moppLibErrorGeneral.rawValue) { + switch nserror.code { + case MoppLibErrorCode.moppLibErrorGeneral.rawValue: message = L(.fileImportOpenExistingFailedAlertMessage, [self?.containerPath.substr(fromLast: "/") ?? String()]) - } else if nserror.code == Int(MoppLibErrorCode.moppLibErrorNoInternetConnection.rawValue) { + case MoppLibErrorCode.moppLibErrorNoInternetConnection.rawValue: message = L(.noConnectionMessage) - } else if nserror.code == Int(MoppLibErrorCode.moppLibErrorInvalidProxySettings.rawValue) { + case MoppLibErrorCode.moppLibErrorInvalidProxySettings.rawValue: message = L(.proxyUnableToConnectToService) + default: break } self?.infoAlert(message: message, dismissCallback: { _ in _ = self?.navigationController?.popViewController(animated: true) diff --git a/MoppApp/MoppApp/SmartIDSignature.swift b/MoppApp/MoppApp/SmartIDSignature.swift index f1fd11e9a..28a143c21 100644 --- a/MoppApp/MoppApp/SmartIDSignature.swift +++ b/MoppApp/MoppApp/SmartIDSignature.swift @@ -171,7 +171,7 @@ class SmartIDSignature { private func validateSignature(cert: Data, signatureValue: Data) -> Void { printLog("\nRIA.SmartID - Validating signature...\n") - MoppLibManager.isSignatureValid(cert, signatureValue: signatureValue, success: { (_) in + MoppLibManager.isSignatureValid(cert, signatureValue: signatureValue, success: { printLog("\nRIA.SmartID - Successfully validated signature!\n") DispatchQueue.main.async { NotificationCenter.default.post( diff --git a/MoppLib/MoppLib.xcodeproj/project.pbxproj b/MoppLib/MoppLib.xcodeproj/project.pbxproj index 019258d3d..09b87e258 100644 --- a/MoppLib/MoppLib.xcodeproj/project.pbxproj +++ b/MoppLib/MoppLib.xcodeproj/project.pbxproj @@ -25,7 +25,6 @@ 54D1647C1E926AAB0069C725 /* MoppLibCardActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54D1647A1E926AAB0069C725 /* MoppLibCardActions.swift */; }; 54D1FF731E4CB6AD006BF123 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 54D1FF751E4CB6AD006BF123 /* Localizable.strings */; }; 54DC0DC91E0BCCEF00C62B3D /* MoppLibConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 54DC0DC71E0BCCEF00C62B3D /* MoppLibConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 54DC0DCA1E0BCCEF00C62B3D /* MoppLibConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 54DC0DC81E0BCCEF00C62B3D /* MoppLibConstants.m */; }; 54DC0E021E0D48C900C62B3D /* MoppLibError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DC0E001E0D48C900C62B3D /* MoppLibError.swift */; }; 54E085EA1E71A63C00431F1A /* Reachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 54E085E81E71A63C00431F1A /* Reachability.h */; }; 54E085EB1E71A63C00431F1A /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 54E085E91E71A63C00431F1A /* Reachability.m */; }; @@ -59,9 +58,6 @@ E42B08CA1E1F11C100EA24A3 /* MoppLibSignature.m in Sources */ = {isa = PBXBuildFile; fileRef = E42B08C81E1F11C100EA24A3 /* MoppLibSignature.m */; }; E42B08CD1E1F136A00EA24A3 /* MoppLibDigidocManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E42B08CB1E1F136A00EA24A3 /* MoppLibDigidocManager.h */; }; E42B08CE1E1F136A00EA24A3 /* MoppLibDigidocManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = E42B08CC1E1F136A00EA24A3 /* MoppLibDigidocManager.mm */; }; - E43BD81D1E3F901D00F6C39D /* EE.xml in Resources */ = {isa = PBXBuildFile; fileRef = E43BD81A1E3F901D00F6C39D /* EE.xml */; }; - E43BD81E1E3F901D00F6C39D /* FI.xml in Resources */ = {isa = PBXBuildFile; fileRef = E43BD81B1E3F901D00F6C39D /* FI.xml */; }; - E43BD81F1E3F901D00F6C39D /* tl-mp.xml in Resources */ = {isa = PBXBuildFile; fileRef = E43BD81C1E3F901D00F6C39D /* tl-mp.xml */; }; E485A7831E2DF58200C53DBF /* MLFileManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E485A7811E2DF58200C53DBF /* MLFileManager.h */; }; E485A7841E2DF58200C53DBF /* MLFileManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E485A7821E2DF58200C53DBF /* MLFileManager.m */; }; /* End PBXBuildFile section */ @@ -101,7 +97,6 @@ 54D1FF821E4DA075006BF123 /* PrefixHeader.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PrefixHeader.pch; sourceTree = ""; }; 54DC0DC31E0BCC2A00C62B3D /* CardReaderWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardReaderWrapper.swift; sourceTree = ""; }; 54DC0DC71E0BCCEF00C62B3D /* MoppLibConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MoppLibConstants.h; sourceTree = ""; }; - 54DC0DC81E0BCCEF00C62B3D /* MoppLibConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MoppLibConstants.m; sourceTree = ""; }; 54DC0E001E0D48C900C62B3D /* MoppLibError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoppLibError.swift; sourceTree = ""; }; 54E085E81E71A63C00431F1A /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = ""; }; 54E085E91E71A63C00431F1A /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = ""; }; @@ -135,9 +130,6 @@ E42B08C81E1F11C100EA24A3 /* MoppLibSignature.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MoppLibSignature.m; sourceTree = ""; }; E42B08CB1E1F136A00EA24A3 /* MoppLibDigidocManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MoppLibDigidocManager.h; sourceTree = ""; }; E42B08CC1E1F136A00EA24A3 /* MoppLibDigidocManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MoppLibDigidocManager.mm; sourceTree = ""; }; - E43BD81A1E3F901D00F6C39D /* EE.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = EE.xml; path = "TSL cache/EE.xml"; sourceTree = ""; }; - E43BD81B1E3F901D00F6C39D /* FI.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = FI.xml; path = "TSL cache/FI.xml"; sourceTree = ""; }; - E43BD81C1E3F901D00F6C39D /* tl-mp.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = "tl-mp.xml"; path = "TSL cache/tl-mp.xml"; sourceTree = ""; }; E485A7811E2DF58200C53DBF /* MLFileManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLFileManager.h; sourceTree = ""; }; E485A7821E2DF58200C53DBF /* MLFileManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MLFileManager.m; sourceTree = ""; }; /* End PBXFileReference section */ @@ -186,15 +178,15 @@ E4250CEA1E09695100530370 /* MoppLib.h */, 54E1DB5A1E44A9060060A250 /* MoppLibManager.h */, 54E1DB5B1E44A9060060A250 /* MoppLibManager.m */, + 54D1647A1E926AAB0069C725 /* MoppLibCardActions.swift */, + C54EA737204D91730039AC78 /* MoppLibCardReaderManager.swift */, 54D164751E9269C50069C725 /* MoppLibContainerActions.h */, 54D164761E9269C50069C725 /* MoppLibContainerActions.m */, 399C01E120BC0EF30056D7AC /* MoppLibCryptoActions.h */, 399C01E220BC11C20056D7AC /* MoppLibCryptoActions.m */, - 54D1647A1E926AAB0069C725 /* MoppLibCardActions.swift */, 542DCB6B1E23968000899534 /* MoppLibPinActions.swift */, 54DC0DC71E0BCCEF00C62B3D /* MoppLibConstants.h */, - 54DC0DC81E0BCCEF00C62B3D /* MoppLibConstants.m */, - C54EA737204D91730039AC78 /* MoppLibCardReaderManager.swift */, + 54DC0E001E0D48C900C62B3D /* MoppLibError.swift */, DFDD76282B507EFF0008EC2C /* MoppLibProxyConfiguration.h */, DFDD762A2B507F9E0008EC2C /* MoppLibProxyConfiguration.m */, DF169D592B9000F0000DD46C /* MoppLibDigidocValidateOnline.h */, @@ -315,32 +307,12 @@ 54DC0DFA1E0D195200C62B3D /* CardActions */, E4180C131E23FE7100FD7B8C /* Utility */, 39266A5220CFC0F4002E3F23 /* SmartToken.swift */, - 54DC0E001E0D48C900C62B3D /* MoppLibError.swift */, E42B08CB1E1F136A00EA24A3 /* MoppLibDigidocManager.h */, E42B08CC1E1F136A00EA24A3 /* MoppLibDigidocManager.mm */, - E4250CF21E096A0500530370 /* libdigidocpp */, ); path = MoppLib; sourceTree = ""; }; - E4250CF21E096A0500530370 /* libdigidocpp */ = { - isa = PBXGroup; - children = ( - E43BD8191E3F901400F6C39D /* TSL cache */, - ); - name = libdigidocpp; - sourceTree = ""; - }; - E43BD8191E3F901400F6C39D /* TSL cache */ = { - isa = PBXGroup; - children = ( - E43BD81A1E3F901D00F6C39D /* EE.xml */, - E43BD81B1E3F901D00F6C39D /* FI.xml */, - E43BD81C1E3F901D00F6C39D /* tl-mp.xml */, - ); - name = "TSL cache"; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -469,10 +441,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - E43BD81D1E3F901D00F6C39D /* EE.xml in Resources */, - E43BD81E1E3F901D00F6C39D /* FI.xml in Resources */, 54D1FF731E4CB6AD006BF123 /* Localizable.strings in Resources */, - E43BD81F1E3F901D00F6C39D /* tl-mp.xml in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -502,7 +471,6 @@ 54D1647C1E926AAB0069C725 /* MoppLibCardActions.swift in Sources */, E42B08CA1E1F11C100EA24A3 /* MoppLibSignature.m in Sources */, DFDD762B2B507F9E0008EC2C /* MoppLibProxyConfiguration.m in Sources */, - 54DC0DCA1E0BCCEF00C62B3D /* MoppLibConstants.m in Sources */, DF169D5C2B90011E000DD46C /* MoppLibDigidocValidateOnline.m in Sources */, 399C01E320BC11C20056D7AC /* MoppLibCryptoActions.m in Sources */, C5E41C5E2180602B00D79B54 /* Idemia.swift in Sources */, diff --git a/MoppLib/MoppLib/MoppLibDigidocManager.h b/MoppLib/MoppLib/MoppLibDigidocManager.h index f6379f933..d5d4240c7 100644 --- a/MoppLib/MoppLib/MoppLibDigidocManager.h +++ b/MoppLib/MoppLib/MoppLibDigidocManager.h @@ -46,7 +46,7 @@ typedef enum { - (MoppLibContainer *)removeDataFileFromContainerWithPath:(NSString *)containerPath atIndex:(NSUInteger)dataFileIndex error:(NSError **)error; - (NSArray *)getContainers; + (NSData *)prepareSignature:(NSData *)cert containerPath:(NSString *)containerPath roleData:(MoppLibRoleAddressData *)roleData; -+ (void)isSignatureValid:(NSData *)cert signatureValue:(NSData *)signatureValue success:(BoolBlock)success failure:(FailureBlock)failure; ++ (void)isSignatureValid:(NSData *)cert signatureValue:(NSData *)signatureValue success:(VoidBlock)success failure:(FailureBlock)failure; - (void)addSignature:(NSString *)containerPath pin2:(NSString *)pin2 cert:(NSData *)cert roleData:(MoppLibRoleAddressData *)roleData success:(ContainerBlock)success andFailure:(FailureBlock)failure; - (MoppLibContainer *)removeSignature:(MoppLibSignature *)moppSignature fromContainerWithPath:(NSString *)containerPath error:(NSError **)error; - (void)container:(NSString *)containerPath saveDataFile:(NSString *)fileName to:(NSString *)path success:(VoidBlock)success failure:(FailureBlock)failure; @@ -56,5 +56,4 @@ typedef enum { - (NSString *)iOSVersion; - (NSString *)userAgent; - (NSString *)userAgent:(BOOL)shouldIncludeDevices; -+ (NSString *)sanitize:(NSString *)text; @end diff --git a/MoppLib/MoppLib/MoppLibDigidocManager.mm b/MoppLib/MoppLib/MoppLibDigidocManager.mm index 160d960c3..550231912 100644 --- a/MoppLib/MoppLib/MoppLibDigidocManager.mm +++ b/MoppLib/MoppLib/MoppLibDigidocManager.mm @@ -323,7 +323,7 @@ - (void)setupWithSuccess:(VoidBlock)success andFailure:(FailureBlock)failure usi return digidoc::X509Cert(reinterpret_cast(data.bytes), data.length); } -+ (void)isSignatureValid:(NSData *)cert signatureValue:(NSData *)data success:(BoolBlock)success failure:(FailureBlock)failure { ++ (void)isSignatureValid:(NSData *)cert signatureValue:(NSData *)data success:(VoidBlock)success failure:(FailureBlock)failure { auto *bytes = reinterpret_cast(data.bytes); std::vector calculatedSignatureBase64(bytes, bytes + data.length); @@ -337,7 +337,7 @@ + (void)isSignatureValid:(NSData *)cert signatureValue:(NSData *)data success:(B if (auto timeStampTime = signature->TimeStampTime(); !timeStampTime.empty()) { printLog(@"\nSignature already validated at %s\n", timeStampTime.c_str()); - success(true); + return success(); } try { @@ -352,7 +352,7 @@ + (void)isSignatureValid:(NSData *)cert signatureValue:(NSData *)data success:(B printLog(@"\nSaving container...\n"); docContainer->save(); printLog(@"\nSignature validated at %s!\n", signature->TimeStampTime().c_str()); - success(true); + success(); } catch(const digidoc::Exception &e) { parseException(e); NSError *error; @@ -566,29 +566,6 @@ - (MoppLibSignature *)getSignatureData:(const digidoc::X509Cert&)cert signature: return moppLibSignature; } -+ (NSString *)sanitize:(NSString *)text { - NSMutableCharacterSet *characterSet = [NSMutableCharacterSet illegalCharacterSet]; - [characterSet addCharactersInString:@"@%:^?[]\'\"”’{}#&`\\~«»/´"]; - NSArray* rtlChars = @[@"\u200E", @"\u200F", @"\u202E", @"\u202A", @"\u202B"]; - - for (int i = 0; i < [rtlChars count]; i++) { - [characterSet addCharactersInString:[rtlChars objectAtIndex:i]]; - } - - while ([text hasPrefix:@"."]) { - if ([text length] > 1) { - text = [text substringFromIndex:1]; - } else { - NSRange replaceRange = [text rangeOfString:@"."]; - if (replaceRange.location != NSNotFound) { - text = [text stringByReplacingCharactersInRange:replaceRange withString:@"_"]; - } - } - } - - return [[text componentsSeparatedByCharactersInSet:characterSet] componentsJoinedByString:@""]; -} - - (std::string)getSerialNumber:(std::string)serialNumber { static const std::set types {"PAS", "IDC", "PNO", "TAX", "TIN"}; if (serialNumber.length() > 6 && (types.find(serialNumber.substr(0, 3)) != types.cend() || serialNumber[2] == ':') && serialNumber[5] == '-') { diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibConstants.h b/MoppLib/MoppLib/PublicInterface/MoppLibConstants.h index 21582b2c8..d17eaeeba 100644 --- a/MoppLib/MoppLib/PublicInterface/MoppLibConstants.h +++ b/MoppLib/MoppLib/PublicInterface/MoppLibConstants.h @@ -31,42 +31,6 @@ typedef NS_ENUM(int, MoppLibSignatureStatus) { UnknownStatus }; -// Mopp Lib error codes - -typedef NS_ENUM(NSInteger, MoppLibErrorCode) { - - moppLibErrorReaderNotFound = 10001, // Reader is not connected to phone - moppLibErrorCardNotFound = 10002, // Reader is connected, but card is not detected - moppLibErrorCardVersionUnknown = 10003, // - moppLibErrorWrongPin = 10004, // Provided pin is wrong - moppLibErrorGeneral = 10005, - moppLibErrorInvalidPin = 10006, // New pin does not apply to rules - moppLibErrorPinMatchesVerificationCode = 10007, // New pin must be different from old pin or puk - moppLibErrorIncorrectPinLength = 10008, // New pin is too short or too long - moppLibErrorPinTooEasy = 10009,// New pin is too easy - moppLibErrorPinContainsInvalidCharacters = 10010, // Pin contains invalid characters. Only numbers are allowed - moppLibErrorUrlSessionCanceled = 10012, // NSURLErrorCanceled occured when connecting to external service. - moppLibErrorXmlParsingError = 10013, // AEXMLDocument loadXml failed to parse data to XML. - MoppLibErrorDDSError = 10014, // Error from DDS - moppLibErrorPinNotProvided = 10015, // User did not provide pin for action that required authentication - moppLibErrorPinBlocked = 10016, // User did not provide pin for action that required authentication - moppLibErrorFileNameTooLong = 10017, // File name too long - moppLibErrorNoInternetConnection = 10018, // No internet connection - moppLibErrorPinMatchesOldCode = 10019, // New pin must be different from old pin or puk - moppLibErrorReaderSelectionCanceled = 10020, // User canceled card reader selection - moppLibErrorRestrictedApi = 10021, // Restricted API. Some functionality is not available for third-party apps - moppLibErrorLdapResponseNotFound = 10022, // Ldap response not found - moppLibErrorDuplicatedFilename = 10023, // Filename already exists - moppLibErrorTooManyRequests = 10024, // Too many requests - moppLibErrorOCSPTimeSlot = 10025, // Invalid OCSP time slot - moppLibErrorReaderProcessFailed = 10026, // Reader process failed - moppLibErrorSslHandshakeFailed = 10027, // SSL handshake failed - moppLibErrorInvalidProxySettings = 10028, // Connecting with current proxy settings failed - -}; - -extern NSString *const kMoppLibUserInfoRetryCount; - @class MoppLibContainer; @class CdocInfo; @@ -75,4 +39,3 @@ typedef void (^ContainerBlock)(MoppLibContainer *container); typedef void (^CdocContainerBlock)(CdocInfo *cdocInfo); typedef void (^DecryptedDataBlock)(NSMutableDictionary *decryptedData); typedef void (^VoidBlock)(void); -typedef void (^BoolBlock)(BOOL); diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibConstants.m b/MoppLib/MoppLib/PublicInterface/MoppLibConstants.m deleted file mode 100644 index df9b91541..000000000 --- a/MoppLib/MoppLib/PublicInterface/MoppLibConstants.m +++ /dev/null @@ -1,26 +0,0 @@ -// -// MoppLibConstants.m -// MoppLib -// -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import "MoppLibConstants.h" - -NSString *const kMoppLibUserInfoRetryCount = @"kMoppLibRetryCount"; diff --git a/MoppLib/MoppLib/MoppLibError.swift b/MoppLib/MoppLib/PublicInterface/MoppLibError.swift similarity index 65% rename from MoppLib/MoppLib/MoppLibError.swift rename to MoppLib/MoppLib/PublicInterface/MoppLibError.swift index 92b155e64..42548ea04 100644 --- a/MoppLib/MoppLib/MoppLibError.swift +++ b/MoppLib/MoppLib/PublicInterface/MoppLibError.swift @@ -23,33 +23,49 @@ import Foundation +// Mopp Lib error codes + +public enum MoppLibErrorCode: Int { + + case moppLibErrorCardNotFound = 10002 // Reader is connected, but card is not detected + case moppLibErrorWrongPin = 10004 // Provided pin is wrong + case moppLibErrorGeneral = 10005 + case moppLibErrorPinMatchesVerificationCode = 10007 // New pin must be different from old pin or puk + case moppLibErrorIncorrectPinLength = 10008 // New pin is too short or too long + case moppLibErrorPinTooEasy = 10009// New pin is too easy + case moppLibErrorPinContainsInvalidCharacters = 10010 // Pin contains invalid characters. Only numbers are allowed + case moppLibErrorPinBlocked = 10016 // User did not provide pin for action that required authentication + case moppLibErrorFileNameTooLong = 10017 // File name too long + case moppLibErrorNoInternetConnection = 10018 // No internet connection + case moppLibErrorPinMatchesOldCode = 10019 // New pin must be different from old pin or puk + case moppLibErrorRestrictedApi = 10021 // Restricted API. Some functionality is not available for third-party apps + case moppLibErrorDuplicatedFilename = 10023 // Filename already exists + case moppLibErrorTooManyRequests = 10024 // Too many requests + case moppLibErrorOCSPTimeSlot = 10025 // Invalid OCSP time slot + case moppLibErrorReaderProcessFailed = 10026 // Reader process failed + case moppLibErrorSslHandshakeFailed = 10027 // SSL handshake failed + case moppLibErrorInvalidProxySettings = 10028 // Connecting with current proxy settings failed + +}; + /// MoppLibError class providing predefined NSError instances @objcMembers public class MoppLibError: NSObject { /// Error domain for MoppLib errors static let MoppLibErrorDomain = "MoppLibError" + static public let kMoppLibUserInfoRetryCount: String = "kMoppLibUserInfoRetryCount" - public static func readerNotFoundError() -> NSError { - return error(code: .moppLibErrorReaderNotFound, message: "Reader is not connected to the device.") - } + private override init() {} - public static func readerProcessFailedError() -> NSError { + static func readerProcessFailedError() -> NSError { return error(code: .moppLibErrorReaderProcessFailed, message: "Reader process failed.") } - public static func readerSelectionCanceledError() -> NSError { - return error(code: .moppLibErrorReaderSelectionCanceled, message: "User canceled reader selection.") - } - - public static func cardNotFoundError() -> NSError { + static func cardNotFoundError() -> NSError { return error(code: .moppLibErrorCardNotFound, message: "ID card could not be detected in reader.") } - public static func cardVersionUnknownError() -> NSError { - return error(code: .moppLibErrorCardVersionUnknown, message: "Card version could not be detected.") - } - - public static func wrongPinError(withRetryCount count: Int) -> NSError { + static func wrongPinError(withRetryCount count: Int) -> NSError { return error(code: .moppLibErrorWrongPin, userInfo: [kMoppLibUserInfoRetryCount: NSNumber(value: count)]) } @@ -57,31 +73,27 @@ public class MoppLibError: NSObject { return error(code: .moppLibErrorGeneral, message: "Could not complete action due to unknown error") } - public static func invalidPinError() -> NSError { - return error(code: .moppLibErrorInvalidPin, message: "Invalid PIN") - } - public static func pinBlockedError() -> NSError { return error(code: .moppLibErrorPinBlocked, userInfo: nil) } - public static func pinMatchesVerificationCodeError() -> NSError { + static func pinMatchesVerificationCodeError() -> NSError { return error(code: .moppLibErrorPinMatchesVerificationCode, message: "New PIN must be different from verification code.") } - public static func pinMatchesOldCodeError() -> NSError { + static func pinMatchesOldCodeError() -> NSError { return error(code: .moppLibErrorPinMatchesOldCode, message: "New PIN must be different from old PIN.") } - public static func incorrectPinLengthError() -> NSError { + static func incorrectPinLengthError() -> NSError { return error(code: .moppLibErrorIncorrectPinLength, message: "PIN length didn't pass validation. Make sure minimum and maximum length requirements are met.") } - public static func tooEasyPinError() -> NSError { + static func tooEasyPinError() -> NSError { return error(code: .moppLibErrorPinTooEasy, message: "New PIN code is too easy.") } - public static func pinContainsInvalidCharactersError() -> NSError { + static func pinContainsInvalidCharactersError() -> NSError { return error(code: .moppLibErrorPinContainsInvalidCharacters, message: "New PIN contains invalid characters.") } @@ -97,7 +109,7 @@ public class MoppLibError: NSObject { return error(code: .moppLibErrorSslHandshakeFailed, message: "Failed to create SSL connection with host.") } - public static func restrictedAPIError() -> NSError { + static func restrictedAPIError() -> NSError { return error(code: .moppLibErrorRestrictedApi, message: "This API method is not supported on third-party applications.") } diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibManager.h b/MoppLib/MoppLib/PublicInterface/MoppLibManager.h index ee50186e0..2e1a5650a 100644 --- a/MoppLib/MoppLib/PublicInterface/MoppLibManager.h +++ b/MoppLib/MoppLib/PublicInterface/MoppLibManager.h @@ -40,7 +40,7 @@ - (void)setupWithSuccess:(VoidBlock)success andFailure:(FailureBlock)failure usingTestDigiDocService:(BOOL)useTestDDS andTSUrl:(NSString *)tsUrl withMoppConfiguration:(MoppLibConfiguration *)moppConfiguration andProxyConfiguration:(MoppLibProxyConfiguration*)proxyConfiguration; + (NSData *)prepareSignature:(NSData *)cert containerPath:(NSString *)containerPath roleData:(MoppLibRoleAddressData *)roleData; -+ (void)isSignatureValid:(NSData *)cert signatureValue:(NSData *)signatureValue success:(BoolBlock)success failure:(FailureBlock)failure; ++ (void)isSignatureValid:(NSData *)cert signatureValue:(NSData *)signatureValue success:(VoidBlock)success failure:(FailureBlock)failure; - (NSString *)libdigidocppVersion; - (BOOL)isConnected; @@ -48,6 +48,5 @@ - (NSString *)iOSVersion; - (NSString *)userAgent; - (NSString *)userAgent:(BOOL)shouldIncludeDevices; -+ (NSString *)sanitize:(NSString *)text; @end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibManager.m b/MoppLib/MoppLib/PublicInterface/MoppLibManager.m index 30f6980e2..e0cec6923 100644 --- a/MoppLib/MoppLib/PublicInterface/MoppLibManager.m +++ b/MoppLib/MoppLib/PublicInterface/MoppLibManager.m @@ -44,7 +44,7 @@ + (NSData *)prepareSignature:(NSData *)cert containerPath:(NSString *)containerP return [MoppLibDigidocManager prepareSignature:cert containerPath:containerPath roleData:roleData]; } -+ (void)isSignatureValid:(NSData *)cert signatureValue:(NSData *)signatureValue success:(BoolBlock)success failure:(FailureBlock)failure { ++ (void)isSignatureValid:(NSData *)cert signatureValue:(NSData *)signatureValue success:(VoidBlock)success failure:(FailureBlock)failure { return [MoppLibDigidocManager isSignatureValid:cert signatureValue:signatureValue success:success failure:failure]; } @@ -73,8 +73,4 @@ - (NSString *)userAgent { return [[MoppLibDigidocManager sharedInstance] userAgent:false]; } -+ (NSString *)sanitize:(NSString *)text { - return [MoppLibDigidocManager sanitize:text]; -} - @end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibPersonalData.swift b/MoppLib/MoppLib/PublicInterface/MoppLibPersonalData.swift index ad7b0106e..76e3dc327 100644 --- a/MoppLib/MoppLib/PublicInterface/MoppLibPersonalData.swift +++ b/MoppLib/MoppLib/PublicInterface/MoppLibPersonalData.swift @@ -42,17 +42,7 @@ public class MoppLibPersonalData: NSObject { //public var notes4: String = "" /// Returns the full name of the card owner. - public func fullName() -> String { - var nameComponents: [String] = [] - - if !givenNames.isEmpty { - nameComponents.append(givenNames) - } - if !surname.isEmpty { - nameComponents.append(surname) - } - - return nameComponents.joined(separator: " ") + public var fullName: String { + return [givenNames, surname].filter { !$0.isEmpty }.joined(separator: " ") } } - diff --git a/MoppLib/MoppLib/TSL cache/EE.xml b/MoppLib/MoppLib/TSL cache/EE.xml deleted file mode 100644 index 4b6e144af..000000000 --- a/MoppLib/MoppLib/TSL cache/EE.xml +++ /dev/null @@ -1,2607 +0,0 @@ - - - 5 - 34 - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - Estonian Technical Regulatory Authority - Tehnilise Järelevalve Amet - Estonian Technical Surveillance Authority - - - - - 23A Sõle St - Tallinn - 10614 - EE - - - - mailto:info@tja.ee - http://sr.riik.ee/en.html - - - - EE:Trusted list including information related to the qualified trust service providers which are supervised by the issuing Member State, together with information related to the qualified trust services provided by them, in accordance with the relevant provisions laid down in Regulation (EU) No 910/2014 of the European Parliament and of the Council of 23 July 2014 on electronic identification and trust services for electronic transactions in the internal market and repealing Directive 1999/93/EC. - - - https://sr.riik.ee/en/tl.html - http://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:32014R0910&from=EN - https://sr.riik.ee/et/tl.html - http://eur-lex.europa.eu/legal-content/ET/TXT/PDF/?uri=CELEX:32014R0910&from=EN - - http://uri.etsi.org/TrstSvc/TrustedList/StatusDetn/EUappropriate - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EE - - EE - - The applicable legal framework for the present trusted list is Regulation (EU) No 910/2014 of the European Parliament and of the Council of 23 July 2014 on electronic identification and trust services for electronic transactions in the internal market and repealing Directive 1999/93/EC. - Käesoleva usaldusnimekirja suhtes kohaldatav õigusraamistik on Euroopa Parlamendi ja nõukogu 23. juuli 2014. aasta määrus (EL) nr 910/2014 e-identimise ja e-tehingute jaoks vajalike usaldusteenuste kohta siseturul ja millega tunnistatakse kehtetuks direktiiv 1999/93/EÜ. - - 65535 - - - - - - MIIGgTCCBGmgAwIBAgIUeaHFHm5f58zYv20JfspVJ3hossYwDQYJKoZIhvcNAQEFBQAwgZIxCzAJBgNVBAYTAk5MMSAwHgYDVQQKExdRdW9WYWRpcyBUcnVzdGxpbmsgQi5WLjEoMCYGA1UECxMfSXNzdWluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE3MDUGA1UEAxMuUXVvVmFkaXMgRVUgSXNzdWluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBHMjAeFw0xMzEwMzAxMjI3MTFaFw0xNjEwMzAxMjI3MTFaMHoxCzAJBgNVBAYTAkJFMRAwDgYDVQQIEwdCcnVzc2VsMRIwEAYDVQQHEwlFdHRlcmJlZWsxHDAaBgNVBAoTE0V1cm9wZWFuIENvbW1pc3Npb24xFDASBgNVBAsTC0luZm9ybWF0aWNzMREwDwYDVQQDDAhFQ19ESUdJVDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJgkkqvJmZaknQC7c6H6LEr3dGtQ5IfOB3HAZZxOZbb8tdM1KMTO3sAifJC5HNFeIWd0727uZj+V5kBrUv36zEs+VxiN1yJBmcJznX4J2TCyPfLk2NRELGu65VwrK2Whp8cLLANc+6pQn/5wKh23ehZm21mLXcicZ8whksUGb/h8p6NDe1cElD6veNc9CwwK2QT0G0mQiEYchqjJkqyY8HEak8t+CbIC4Rrhyxh3HI1fCK0WKS9JjbPQFbvGmfpBZuLPYZYzP4UXIqfBVYctyodcSAnSfmy6tySMqpVSRhjRn4KP0EfHlq7Ec+H3nwuqxd0M4vTJlZm+XwYJBzEFzFsCAwEAAaOCAeQwggHgMFgGA1UdIARRME8wCAYGBACLMAECMEMGCisGAQQBvlgBgxAwNTAzBggrBgEFBQcCARYnaHR0cDovL3d3dy5xdW92YWRpc2dsb2JhbC5ubC9kb2N1bWVudGVuMCQGCCsGAQUFBwEDBBgwFjAKBggrBgEFBQcLAjAIBgYEAI5GAQEwdAYIKwYBBQUHAQEEaDBmMCoGCCsGAQUFBzABhh5odHRwOi8vb2NzcC5xdW92YWRpc2dsb2JhbC5jb20wOAYIKwYBBQUHMAKGLGh0dHA6Ly90cnVzdC5xdW92YWRpc2dsb2JhbC5jb20vcXZldWNhZzIuY3J0MEYGCiqGSIb3LwEBCQEEODA2AgEBhjFodHRwOi8vdHNhMDEucXVvdmFkaXNnbG9iYWwuY29tL1RTUy9IdHRwVHNwU2VydmVyMBMGCiqGSIb3LwEBCQIEBTADAgEBMA4GA1UdDwEB/wQEAwIGQDAfBgNVHSMEGDAWgBTg+A751LXyf0kjtsN5x6M1H4Z6iDA7BgNVHR8ENDAyMDCgLqAshipodHRwOi8vY3JsLnF1b3ZhZGlzZ2xvYmFsLmNvbS9xdmV1Y2FnMi5jcmwwHQYDVR0OBBYEFDc3hgIFJTDamDEeQczI7Lot4uaVMA0GCSqGSIb3DQEBBQUAA4ICAQAZ8EZ48RgPimWY6s4LjZf0M2MfVJmNh06Jzmf6fzwYtDtQLKzIDk8ZtosqYpNNBoZIFICMZguGRAP3kuxWvwANmrb5HqyCzXThZVPJTmKEzZNhsDtKu1almYBszqX1UV7IgZp+jBZ7FyXzXrXyF1tzXQxHGobDV3AEE8vdzEZtwDGpZJPnEPCBzifdY+lrrL2rDBjbv0VeildgOP1SIlL7dh1O9f0T6T4ioS6uSdMt6b/OWjqHadsSpKry0A6pqfOqJWAhDiueqgVB7vus6o6sSmfG4SW9EWW+BEZ510HjlQU/JL3PPmf+Xs8s00sm77LJ/T/1hMUuGp6TtDsJe+pPBpCYvpm6xu9GL20CsArFWUeQ2MSnE1jsrb00UniCKslcM63pU7I0VcnWMJQSNY28OmnFESPK6s6zqoN0ZMLhwCVnahi6pouBwTb10M9/Anla9xOT42qxiLr14S2lHy18aLiBSQ4zJKNLqKvIrkjewSfW+00VLBYbPTmtrHpZUWiCGiRS2SviuEmPVbdWvsBUaq7OMLIfBD4nin1FlmYnaG9TVmWkwVYDsFmQepwPDqjPs4efAxzkgUFHWn0gQFbqxRocKrCsOvCDHOHORA97UWcThmgvr0Jl7ipvP4Px//tRp08blfy4GMzYls5WF8f6JaMrNGmpfPasd9NbpBNp7A== - - - - - MIID/DCCAuSgAwIBAgIQEAAAAAAAWgS4SGkJJUcHdzANBgkqhkiG9w0BAQUFADAzMQswCQYDVQQGEwJCRTETMBEGA1UEAxMKQ2l0aXplbiBDQTEPMA0GA1UEBRMGMjAxMzA2MB4XDTEzMDcxNzE3NDQwOFoXDTE4MDcxMzIzNTk1OVowbjELMAkGA1UEBhMCQkUxITAfBgNVBAMTGFBpZXJyZSBEYW1hcyAoU2lnbmF0dXJlKTEOMAwGA1UEBBMFRGFtYXMxFjAUBgNVBCoMDVBpZXJyZSBBbmRyw6kxFDASBgNVBAUTCzYwMDIxMjExOTE5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMv+7DvhzLwG3prirUDGaYRS2+jBZtN2cYXuloKSqAc5Q58FEmk0gsZRF+/4dkt8hgCvbBcpmG6FcvTfNxQbxPX88yYwpBYsWnJ3aD5P4QrN2+fZxwxfXxRRcX+t30IBpr+WYFv/GhJhoFo0LWUehC4eyvnMfP4J/MR4TGlQRrcwIDAQABo4IBUzCCAU8wHwYDVR0jBBgwFoAUww/Dck0/3rI43jkuR2RQ//KP88cwbgYIKwYBBQUHAQEEYjBgMDYGCCsGAQUFBzAChipodHRwOi8vY2VydHMuZWlkLmJlbGdpdW0uYmUvYmVsZ2l1bXJzMi5jcnQwJgYIKwYBBQUHMAGGGmh0dHA6Ly9vY3NwLmVpZC5iZWxnaXVtLmJlMEQGA1UdIAQ9MDswOQYHYDgJAQECATAuMCwGCCsGAQUFBwIBFiBodHRwOi8vcmVwb3NpdG9yeS5laWQuYmVsZ2l1bS5iZTA5BgNVHR8EMjAwMC6gLKAqhihodHRwOi8vY3JsLmVpZC5iZWxnaXVtLmJlL2VpZGMyMDEzMDYuY3JsMA4GA1UdDwEB/wQEAwIGQDARBglghkgBhvhCAQEEBAMCBSAwGAYIKwYBBQUHAQMEDDAKMAgGBgQAjkYBATANBgkqhkiG9w0BAQUFAAOCAQEAEE3KGmLX5XXqArQwIZQmQEE6orKSu3a1z8ey1txsZC4rMk1vpvC6MtsfDaU4N6ooprhcM/WAlcIGOPCNhvxV+xcY7gUBwa6myiClnK0CMSiGYHqWcJG8ns13B9f0+5PJqsoziPoksXb2A9VXkr5aEdEmBYLjh7wG7GwAuDgDT0v87qtphN02/MAlJcNqT3JUUAotD7yfEybmK245jKo+pTYeCHGh7r1HzVWhbUDcQ/e1PpQXjVqBmr4k1ACtuu4H19t6K1P5kf7ta5JFEJPFgy3Hxt6YqzoY07WTVEpS4gJqtleIdX1Fhse7jq83ltcCzlfysBRqY/okUzipo1rbQw== - - - - - MIID/TCCAuWgAwIBAgIQEAAAAAAAWcxEUPr16SDrtzANBgkqhkiG9w0BAQUFADAzMQswCQYDVQQGEwJCRTETMBEGA1UEAxMKQ2l0aXplbiBDQTEPMA0GA1UEBRMGMjAxMzExMB4XDTEzMDcyNDAxNDUzMVoXDTE4MDcxODIzNTk1OVowbzELMAkGA1UEBhMCQkUxIjAgBgNVBAMTGU1hYXJ0ZW4gT3R0b3kgKFNpZ25hdHVyZSkxDjAMBgNVBAQTBU90dG95MRYwFAYDVQQqEw1NYWFydGVuIEpvcmlzMRQwEgYDVQQFEws4MzEyMTQyNDEwMjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAjbr1T8USYkuh4X+Yi+coykq7mbF8PjgyjWQ28uODqRCkynuqJz468tCIYxsM/+/QdqEFq4Z5Z1YDbBYb5KsxfBmkzr9D+Gt49iWVt9Ig+FhngbOexwCW108t6Q/+NAo6gwl6IKkzv2wpEJIwtc51VFzvM+WkE1mNmclphYRTL5UCAwEAAaOCAVMwggFPMB8GA1UdIwQYMBaAFLws1Y0dT3YXfAzva5To9R51FmNhMG4GCCsGAQUFBwEBBGIwYDA2BggrBgEFBQcwAoYqaHR0cDovL2NlcnRzLmVpZC5iZWxnaXVtLmJlL2JlbGdpdW1yczIuY3J0MCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5laWQuYmVsZ2l1bS5iZTBEBgNVHSAEPTA7MDkGB2A4CQEBAgEwLjAsBggrBgEFBQcCARYgaHR0cDovL3JlcG9zaXRvcnkuZWlkLmJlbGdpdW0uYmUwOQYDVR0fBDIwMDAuoCygKoYoaHR0cDovL2NybC5laWQuYmVsZ2l1bS5iZS9laWRjMjAxMzExLmNybDAOBgNVHQ8BAf8EBAMCBkAwEQYJYIZIAYb4QgEBBAQDAgUgMBgGCCsGAQUFBwEDBAwwCjAIBgYEAI5GAQEwDQYJKoZIhvcNAQEFBQADggEBAHNRipzOD4aXB7Oo4FgfBbWgPkmUGTqkz2jK9U2tEWUbyQrhirgqhxK6YMAHBvzL+7BHouMEAuxycZG3ozAfEDRZiznFWyqS8QlnHUe0ThaAvs8v5wYOUO7lJ6vnaNLLvQj7W3L5kCnEva5h0Jh9wMytlNp89dd02l7MD4BsidXoMN21AE8su39tBmNayLF6YrFLe3Zob4fQCuIEbx/pj3kYIVC4WM7uuDx+QpEJdNBtB41o2q2JJFqusRP7W0phkxX7sPtYkot6RXLdgaZNoB4YIRwGozIvcegydRVqpcYrvFSoppNHQqd8ZNzswjGzqBhlWYPsxdjjsxJiUyk7T1c= - - - - - MIIGgDCCBGigAwIBAgIUWH+El24rfQt9YeTtrAZC9UzssuQwDQYJKoZIhvcNAQEFBQAwgZIxCzAJBgNVBAYTAk5MMSAwHgYDVQQKExdRdW9WYWRpcyBUcnVzdGxpbmsgQi5WLjEoMCYGA1UECxMfSXNzdWluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE3MDUGA1UEAxMuUXVvVmFkaXMgRVUgSXNzdWluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBHMjAeFw0xNTEyMDQxMjA5MzVaFw0xODEyMDQxMjA5MjRaMHkxCzAJBgNVBAYTAkJFMRAwDgYDVQQIEwdCcnVzc2VsMRIwEAYDVQQHEwlFdHRlcmJlZWsxHDAaBgNVBAoTE0V1cm9wZWFuIENvbW1pc3Npb24xEzARBgNVBAsTCkRHIENPTk5FQ1QxETAPBgNVBAMMCEVDX0NORUNUMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtXQoPmP4DPSZDKuHcecqX6durKKczAuiEimbZAuuOgMQ9P7g2EIWrACuwNLXKxFXikxOSJWg+nYytJ/ty+1njYa8Nmhp4MYc4UoF3WzQCiz63atK9AuNOMrODBaAGrQNYqXyuEet+i5NaibRYPEtptXzoY0Pif6Zv3qauBlCJnf7kbGkHq9sh8sEXnMaWGjm0EHna8NTh1LjnzCb6N2capQDt+RRrUiBee3YMST3Fo3kKQTKaBvvcYAJ4Mgs/9+Dvwm52dIaMc1vaP1MN2dUW45EWDKtaRfV9flkAy0iT8P8qvUkyGn1XBXnM/gyohOq9cSaP09vPMX6ArmFPlQSiwIDAQABo4IB5DCCAeAwWAYDVR0gBFEwTzAIBgYEAIswAQIwQwYKKwYBBAG+WAGDEDA1MDMGCCsGAQUFBwIBFidodHRwOi8vd3d3LnF1b3ZhZGlzZ2xvYmFsLm5sL2RvY3VtZW50ZW4wJAYIKwYBBQUHAQMEGDAWMAoGCCsGAQUFBwsCMAgGBgQAjkYBATB0BggrBgEFBQcBAQRoMGYwKgYIKwYBBQUHMAGGHmh0dHA6Ly9vY3NwLnF1b3ZhZGlzZ2xvYmFsLmNvbTA4BggrBgEFBQcwAoYsaHR0cDovL3RydXN0LnF1b3ZhZGlzZ2xvYmFsLmNvbS9xdmV1Y2FnMi5jcnQwRgYKKoZIhvcvAQEJAQQ4MDYCAQGGMWh0dHA6Ly90c2EwMS5xdW92YWRpc2dsb2JhbC5jb20vVFNTL0h0dHBUc3BTZXJ2ZXIwEwYKKoZIhvcvAQEJAgQFMAMCAQEwDgYDVR0PAQH/BAQDAgZAMB8GA1UdIwQYMBaAFOD4DvnUtfJ/SSO2w3nHozUfhnqIMDsGA1UdHwQ0MDIwMKAuoCyGKmh0dHA6Ly9jcmwucXVvdmFkaXNnbG9iYWwuY29tL3F2ZXVjYWcyLmNybDAdBgNVHQ4EFgQUQX94XsDFzQFNiSGpboQqB53MiyAwDQYJKoZIhvcNAQEFBQADggIBAJfRbSpp2RTfVtyu4G1TDVXE6RgoIQ5XrUASAmhDWktT5PJReSg5INMFxi3jSPAO7p29bEU32wllZGPVN+A9b2SZmhHyYx9ZoBTMekKlx0qHkU4FfcicIznXo9EVplMtgjplqRltiLqxwXU5uIxKJ2R6BJwjokUWcpei1ifs14SgAve8firXwiG1kFcoClfLjyj4SuDFxT+0e/dhfGfQMfvVBp4xa5tOGYDS7kzf7xvftYlPHW1AbEzjuPmViGgen8ZD/WkuqzdygizOocFQNshGH/mFnQxT4ILAubWJX5gcvmjaZ9N/Lxh041Ra2s8YK5l1DHBcZzz6y2j9OhxPgCvzz3/71DsiGVaK/TO5HxJNcjKlkBblXE4dgy3wqjpUzqkVltC+Xli23Ljny4tenz0QNOx3SQBA1R/hZE5QKD0L0wOc4Np1VxGZbCWGFqta8KKhEA19KlW03Yix9aqe86iNKoJm3n/4BBgdYGu5c+DnqKWj3D7NnxCVZwuLOKzWSCEisl2kHdgnZ3Qix5Vc5QYWexSHeQfCuJAARCDvhdnOidUyiZRnQ6R4VHt0GgNQcYKrmz+UdEroSeQCuSvXIh+LIEJpayWSo9vxi3OgO2IRSi+7Kh5h7LAfWcIwpVY8u0BpRoNJg5xMjvF49GDJc1QeKdlqCBm05N4c2d5t5/aa - - - - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl-mp.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUlistofthelists - - - EU - - - application/vnd.etsi.tsl+xml - - - - European Commission - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUlistofthelists - - - - - - 2016-12-27T01:00:00Z - - 2017-06-27T00:00:00Z - - - https://sr.riik.ee/tsl/estonian-tsl.xml - - - - - - - AS Sertifitseerimiskeskus - - - VATEE-100687640 - AS Sertifitseerimiskeskus - ESTEID - SK - - - - - Pärnu mnt 141 - Tallinn - 11314 - EE - - - - mailto:info@sk.ee - http://www.sk.ee/en - - - - https://www.sk.ee/en/repository/CPS - https://www.sk.ee/repositoorium/CPS - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - - ESTEID-SK - - - -MIIFAjCCA+qgAwIBAgIEPERcgjANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAyMDExNTE2NDQ1MFoXDTEyMDExMzE2NDQ1MFowfDEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEPMA0GA1UECxMGRVNURUlEMQowCAYDVQQEEwExMRIwEAYDVQQDEwlFU1RFSUQtU0swggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCLeZO5NVo3zbwA8eFVCrrbeZQKvPDB7LUDPvzCqw7U2sC+IwEOdjjpJRF4lxFs+f8yC1bP+rqtWzrKhhJ2owfSAlIZMbly/OFjfLqOcyyi7qdfA/66u+69u/DY9tW5fqW93D73v5WNcNoIemCTydh9IFkQvMihWKH7LblBzCHa4W6qUcBZ7QsBgYpQS9n9fGJt5D2wCDeq0pF1Zy72G3CQFrpuR/aPG28tv9r+C7oqncapbiJ7xIOa77Fm3o07M/9aarq/m1oHEp9CxYiH9nmD3kyMe8yxw5v02MTMmAcxOm83z5O4oXSDTALG5gDfZNPjJaNPno7J8FuGrI3vV8z3AgMBAAGjggGpMIIBpTAMBgNVHRMEBTADAQH/MA4GA1UdDwEB/wQEAwIB5jCCARYGA1UdIASCAQ0wggEJMIIBBQYKKwYBBAHOHwEBATCB9jCB0AYIKwYBBQUHAgIwgcMegcAAUwBlAGUAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAIABvAG4AIAB2AOQAbABqAGEAcwB0AGEAdAB1AGQAIABBAFMALQBpAHMAIABTAGUAcgB0AGkAZgBpAHQAcwBlAGUAcgBpAG0AaQBzAGsAZQBzAGsAdQBzACAAYQBsAGEAbQAtAFMASwAgAHMAZQByAHQAaQBmAGkAawBhAGEAdABpAGQAZQAgAGsAaQBuAG4AaQB0AGEAbQBpAHMAZQBrAHMwIQYIKwYBBQUHAgEWFWh0dHA6Ly93d3cuc2suZWUvY3BzLzArBgNVHR8EJDAiMCCgHqAchhpodHRwOi8vd3d3LnNrLmVlL2p1dXIvY3JsLzAfBgNVHSMEGDAWgBQEqnpHo+SJrxrPCkCnGD9v7+l9vjAdBgNVHQ4EFgQUeBe1BfmzWM1ZjN5nXkQGTHWGaV0wDQYJKoZIhvcNAQEFBQADggEBAFIsMHaq4Ffkrxmzw38rHYh5Ia5JGxjtWfPpag9pBtQNZHzY8j97xfPI15haE9Ah3u1WC+bsU2SndVSUGaZ0gKafMxDOy2DUw3B84ymbNRiAFSWty+aKrMCjtdlPktbSQmxNSJAX9vVtM4Y2ory+dtAQ7g11GKHJ+l8BDUpOJA+l8hvS2l4K5whWDHCSqlplMiHPIKgBVArFRNzAq6dquMY+kS3e2PL+PM4GdDW5lRHR/6KUy0BHP2gX/BO4mYQ3BH2BHImUclNras0HISnV/pt6hIkgd1PsFt3rtEolAWP4DWBmc4zAYQJ5t0cEwFM329zCXSGIQIm3a1cMugF5Q/k= - - -CN=ESTEID-SK, SURNAME=1, OU=ESTEID, O=AS Sertifitseerimiskeskus, C=EE, EMAILADDRESS=pki@sk.ee - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - https://sk.ee/en/repository/CP/ - https://sk.ee/repositoorium/CP/ - - - - - - - - - - - true - - - true - - This service issues qualified certificates for e-signing and e-authentication within the same process. The Relying Party shall make distinction by inspection of keyUsage field contents - e-signature certificates have nonRepudation bit set exclusively. Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) and that has either its nR or its dS bit set is to be considered as supported by an QSCD - - - - - - - - - - true - - All certificates issued under this CA/QC service that have nonRepudiation bit set exclusively are issued as qualified certificates - - - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - -ESTEID-SK: Qualified certificates for Estonian ID-card - - - - CN=ESTEID-SK, SURNAME=1, OU=ESTEID, O=AS Sertifitseerimiskeskus, C=EE, EMAILADDRESS=pki@sk.ee - - - eBe1BfmzWM1ZjN5nXkQGTHWGaV0= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2002-01-15T17:44:50Z - - - - - - - - - - true - - - true - - This service issues qualified certificates for e-signing and e-authentication within the same process. The Relying Party shall make distinction by inspection of keyUsage field contents - e-signature certificates have nonRepudation bit set exclusively. Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) and that has either its nR or its dS bit set is to be considered as supported by an SSCD - - - - - - - - - true - - All certificates issued under this CA/QC service that have nonRepudiation bit set exclusively are issued as qualified certificates - - - - - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - - ESTEID-SK 2007 - - - -MIID0zCCArugAwIBAgIERZugDTANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTA3MDEwMzEyMjIzN1oXDTE2MDgyNjE0MjMwMVowWzELMAkGA1UEBhMCRUUxIjAgBgNVBAoTGUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMxDzANBgNVBAsTBkVTVEVJRDEXMBUGA1UEAxMORVNURUlELVNLIDIwMDcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDtWp2jLCsA7K9AxoPDOL0geM1GoR0Q6wSUICCJYyFkUMboEMxpSzFB6tlb0ySlHEU6Fs+tjA4QrSqwaw0uNk4BXv1lkoOr6DUc+20+AQd5jB6A0atrltZ1XG5IvDEep3DJPykkk2MPxUz7dZx7XUEr/kdUWI9cDIkFWic7y9oTBY9JaV6lxm08kweZ/qTw5PU8/bTvZCE0ygvBXU4TDS2FpUJ/+jTzM2ocWa3QjFQv2Sir6LBvgNY3du/m+WLABq0dgN18R4nhFtmaVepqAeUuEi8eRBl6yLTSmMwYCY46LsK5CdjTCZSZv934FtNuyY6Ph9nCXJAgNAY+GfNJfdMXAgMBAAGjgZwwgZkwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAf4wMwYDVR0fBCwwKjAooCagJIYiaHR0cDovL3d3dy5zay5lZS9jcmxzL2p1dXIvY3JsLmNybDAfBgNVHSMEGDAWgBQEqnpHo+SJrxrPCkCnGD9v7+l9vjAdBgNVHQ4EFgQUSAbevoyHV5WAeGP6nCMrK6A6GHUwDQYJKoZIhvcNAQEFBQADggEBACO6SJrjN5WZuiLSMy/tSmT/w3dd/KPErSAdUIJYkC7hOIauW7jZ3VNgNUMHSIkUoP8AviEMjGA4lkT61YScpJAdmgl8Y80HFdZV5CsThhddoIdZ3cZjSI4NZmTVkSduTjoySALxKL3ZEIPrepQDvNEeV1WSpI5+u/vMekUWJSPc8BK9O2av1e9ResKyPJidqrIksHFjNS+Yt8Ouw7F10MHaPPzMiwoa0DYTVsIKJncPTQmvdJG8M0DDToiiNPQuUy5d1CA75Wtjs+yILGZXpOfbdoQhE7G4pbZaF1s69jKp+zc0ZT4g2OoKfI2TiIX9qeGJMxkOENcd1DDqYVfePmo= - - -CN=ESTEID-SK 2007, OU=ESTEID, O=AS Sertifitseerimiskeskus, C=EE - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - https://sk.ee/repositoorium/CP/ - https://sk.ee/en/repository/CP/ - - - - - - - - - - - true - - - true - - This service issues qualified certificates for e-signing and e-authentication within the same process. The Relying Party shall make distinction by inspection of keyUsage field contents - e-signature certificates have nonRepudation bit set exclusively. Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) and that has either its nR or its dS bit set is to be considered as supported by an QSCD - - - - - - - - - - true - - All certificates issued under this CA/QC service that have nonRepudiation bit set exclusively are issued as qualified certificates - - - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - -ESTEID-SK 2007: Qualified certificates for Estonian ID-card, the residence permit card, the digital identity card, the digital identity card in form of the Mobile-ID - - - - CN=ESTEID-SK 2007, OU=ESTEID, O=AS Sertifitseerimiskeskus, C=EE - - - SAbevoyHV5WAeGP6nCMrK6A6GHU= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2007-01-03T13:22:37Z - - - - - - - - - - true - - - true - - This service issues qualified certificates for e-signing and e-authentication within the same process. The Relying Party shall make distinction by inspection of keyUsage field contents - e-signature certificates have nonRepudation bit set exclusively. Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) and that has either its nR or its dS bit set is to be considered as supported by an SSCD - - - - - - - - - true - - All certificates issued under this CA/QC service that have nonRepudiation bit set exclusively are issued as qualified certificates - - - - - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - - ESTEID-SK 2011 - - - -MIIFBTCCA+2gAwIBAgIQKVKTqv2MxtRNgzCjwmRRDTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMB4XDTExMDMxODEwMTQ1OVoXDTI0MDMxODEwMTQ1OVowZDELMAkGA1UEBhMCRUUxIjAgBgNVBAoMGUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMxFzAVBgNVBAMMDkVTVEVJRC1TSyAyMDExMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz6XxsZh6r/aXcNe3kSpNMOqmQoAXUpzzcr4ZSaGZh/7JHIiplvNi6tbW/lK7sAiRsb65KzMWROEauld66ggbDPga6kU97C+AXGu7+DROXstjUOv6VlrHZVAnLmIOkycpWaxjM+EfQPZuDxEbkw96B3/fG69Zbp3s9y6WEhwU5Y9IiQl8YTkGnNUxidQbON1BGQm+HVEsgTf22J6r6G3FsE07rnMNskNC3DjuLSCUKF4kH0rVGVK9BdiCdFaZjHEykjwjIGzqnyxyRKe4YbJ6B9ABm95eSFgMBHtZEYU+q0VUIQGhAGAurOTXjWi1TssA42mnLGQZEI5GXMXtabp51AgMBAAGjggGgMIIBnDASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjCB9gYDVR0gBIHuMIHrMIHoBgsrBgEEAc4fZAEBATCB2DCBsgYIKwYBBQUHAgIwgaUegaIASwBhAHMAdQB0AGEAdABhAGsAcwBlACAAaQBzAGkAawB1AHQAdAD1AGUAbgBkAGEAdgBhAGwAZQAgAGQAbwBrAHUAbQBlAG4AZABpAGwAZQAgAGsAYQBuAHQAYQB2AGEAdABlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0AGkAZABlACAAdgDkAGwAagBhAHMAdABhAG0AaQBzAGUAawBzAC4wIQYIKwYBBQUHAgEWFWh0dHBzOi8vd3d3LnNrLmVlL0NQUzAdBgNVHQ4EFgQUe2ryVVBcuNl6CIdBrvqiKz1bV3YwHwYDVR0jBBgwFoAUEvJaPupWHL/NBqzx8SXJqUvUFJkwPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL3d3dy5zay5lZS9yZXBvc2l0b3J5L2NybHMvZWVjY3JjYS5jcmwwDQYJKoZIhvcNAQEFBQADggEBAKC4IN3FC2gVDIH05TNMgFrQOCGSnXhzoJclRLoQ81BCOXTZI4qn7N74FHEnrAy6uNG7SS5qANqSaPIL8dp63jg/L4qn4iWaB5q5GGJOV07SnTHS7gUrqChGClnUeHxiZbL13PkP37Lnc+TKl1SKfgtn5FbH5cqrhvbA/VF3Yzlimu+L7EVohW9HKxZ//z8kDn6ieiPFfZdTOov/0eXVLlxqklybUuS6LYRRDiqQupgBKQBTwNbC8x0UHX00HokW+dCVcQvsUbv4xLhRq/MvyTthE+RdbkrV0JuzbfZvADfj75nA3+ZAzFYS5ZpMOjZ9p4rQVKpzQTklrF0m6mkdcEo= - - -EMAILADDRESS=pki@sk.ee, CN=ESTEID-SK 2011, O=AS Sertifitseerimiskeskus, C=EE - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - https://sk.ee/repositoorium/CP/ - https://sk.ee/en/repository/CP/ - - - - - - - - - - - true - - - true - - This service issues qualified certificates for e-signing and e-authentication within the same process. The Relying Party shall make distinction by inspection of keyUsage field contents - e-signature certificates have nonRepudation bit set exclusively. Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) and that has either its nR or its dS bit set is to be considered as supported by an QSCD - - - - - - - - - - true - - All certificates issued under this CA/QC service that have nonRepudiation bit set exclusively are issued as qualified certificates - - - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - -ESTEID-SK 2011: Qualified certificates for Estonian ID-card, the residence permit card, the digital identity card, the digital identity card in form of the Mobile-ID - - - - EMAILADDRESS=pki@sk.ee, CN=ESTEID-SK 2011, O=AS Sertifitseerimiskeskus, C=EE - - - e2ryVVBcuNl6CIdBrvqiKz1bV3Y= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2011-03-18T11:14:59Z - - - - - - - - - - true - - - true - - This service issues qualified certificates for e-signing and e-authentication within the same process. The Relying Party shall make distinction by inspection of keyUsage field contents - e-signature certificates have nonRepudation bit set exclusively. Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) and that has either its nR or its dS bit set is to be considered as supported by an SSCD - - - - - - - - - true - - All certificates issued under this CA/QC service that have nonRepudiation bit set exclusively are issued as qualified certificates - - - - - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - - ESTEID-SK 2015 - - - -MIIGcDCCBVigAwIBAgIQRUgJC4ec7yFWcqzT3mwbWzANBgkqhkiG9w0BAQwFADB1MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCAXDTE1MTIxNzEyMzg0M1oYDzIwMzAxMjE3MjM1OTU5WjBjMQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEXMBUGA1UEYQwOTlRSRUUtMTA3NDcwMTMxFzAVBgNVBAMMDkVTVEVJRC1TSyAyMDE1MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0oH61NDxbdW9k8nLA1qGaL4B7vydod2Ewp/STBZB3wEtIJCLdkpEsS8pXfFiRqwDVsgGGbu+Q99trlb5LI7yi7rIkRov5NftBdSNPSU5rAhYPQhvZZQgOwRaHa5Ey+BaLJHmLqYQS9hQvQsCYyws+xVvNFUpK0pGD64iycqdMuBl/nWq3fLuZppwBh0VFltm4nhr/1S0R9TRJpqFUGbGr4OK/DwebQ5PjhdS40gCUNwmC7fPQ4vIH+x+TCk2aG+u3MoAz0IrpVWqiwzG/vxreuPPAkgXeFCeYf6fXLsGz4WivsZFbph2pMjELu6sltlBXfAG3fGv43t91VXicyzR/eT5dsB+zFsW1sHV+1ONPr+qzgDxCH2cmuqoZNfIIq+buob3eA8ee+XpJKJQr+1qGrmhggjvAhc7m6cU4x/QfxwRYhIVNhJf+sKVThkQhbJ9XxuKk3c18wymwL1mpDD0PIGJqlssMeiuJ4IzagFbgESGNDUd4icm0hQT8CmQeUm1GbWeBYseqPhMQX97QFBLXJLVy2SCyoAz7Bq1qA43++EcibN+yBc1nQs2Zoq8ck9MK0bCxDMeUkQUz6VeQGp69ImOQrsw46qTz0mtdQrMSbnkXCuLan5dPm284J9HmaqiYi6j6KLcZ2NkUnDQFesBVlMEm+fHa2iR6lnAFYZ06UECAwEAAaOCAgowggIGMB8GA1UdIwQYMBaAFBLyWj7qVhy/zQas8fElyalL1BSZMB0GA1UdDgQWBBSzq4i8mdVipIUqCM20HXI7g3JHUTAOBgNVHQ8BAf8EBAMCAQYwdwYDVR0gBHAwbjAIBgYEAI96AQIwCQYHBACL7EABAjAwBgkrBgEEAc4fAQEwIzAhBggrBgEFBQcCARYVaHR0cHM6Ly93d3cuc2suZWUvQ1BTMAsGCSsGAQQBzh8BAjALBgkrBgEEAc4fAQMwCwYJKwYBBAHOHwEEMBIGA1UdEwEB/wQIMAYBAf8CAQAwQQYDVR0eBDowOKE2MASCAiIiMAqHCAAAAAAAAAAAMCKHIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCcGA1UdJQQgMB4GCCsGAQUFBwMJBggrBgEFBQcDAgYIKwYBBQUHAwQwfAYIKwYBBQUHAQEEcDBuMCAGCCsGAQUFBzABhhRodHRwOi8vb2NzcC5zay5lZS9DQTBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5zay5lZS9jZXJ0cy9FRV9DZXJ0aWZpY2F0aW9uX0NlbnRyZV9Sb290X0NBLmRlci5jcnQwPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL3d3dy5zay5lZS9yZXBvc2l0b3J5L2NybHMvZWVjY3JjYS5jcmwwDQYJKoZIhvcNAQEMBQADggEBAHRWDGI3P00r2sOnlvLHKk9eE7X93eT+4e5TeaQsOpE5zQRUTtshxN8Bnx2ToQ9rgi18q+MwXm2f0mrGakYYG0bix7ZgDQvCMD/kuRYmwLGdfsTXwh8KuL6uSHF+U/ZTss6qG7mxCHG9YvebkN5Yj/rYRvZ9/uJ9rieByxw4wo7b19p22PXkAkXP5y3+qK/Oet98lqwI97kJhiS2zxFYRk+dXbazmoVHnozYKmsZaSUvoYNNH19tpS7BLdsgi9KpbvQLb5ywIMq9ut3+b2Xvzq8yzmHMFtLIJ6Afu1jJpqD82BUAFcvi5vhnP8M7b974R18WCOpgNQvXDI+2/8ZINeU= - - -CN=ESTEID-SK 2015,2.5.4.97=#130e4e545245452d3130373437303133,O=AS Sertifitseerimiskeskus,C=EE - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - https://sk.ee/repositoorium/CP/ - https://sk.ee/en/repository/CP/ - - - - - - - - - - - true - - - true - - This service issues qualified certificates for e-signing and e-authentication within the same process. The Relying Party shall make distinction by inspection of keyUsage field contents - e-signature certificates have nonRepudation bit set exclusively. Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) and that has either its nR or its dS bit set is to be considered as supported by an QSCD - - - - - - - - - - true - - All certificates issued under this CA/QC service that have nonRepudiation bit set exclusively are issued as qualified certificates - - - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - -ESTEID-SK 2015: Qualified certificates for Estonian ID-card, the residence permit card, the digital identity card, the digital identity card in form of the Mobile-ID - - - - CN=ESTEID-SK 2015, OID.2.5.4.97=NTREE-10747013, O=AS Sertifitseerimiskeskus, C=EE - - - s6uIvJnVYqSFKgjNtB1yO4NyR1E= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2015-12-17T12:38:00Z - - - - - - - - - - true - - - true - - This service issues qualified certificates for e-signing and e-authentication within the same process. The Relying Party shall make distinction by inspection of keyUsage field contents - e-signature certificates have nonRepudation bit set exclusively. Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) and that has either its nR or its dS bit set is to be considered as supported by an SSCD - - - - - - - - - true - - All certificates issued under this CA/QC service that have nonRepudiation bit set exclusively are issued as qualified certificates - - - - - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - - EID-SK 2007 - - - -MIID4jCCAsqgAwIBAgIERZ4nqjANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTA3MDEwNTEwMjU0NloXDTE2MDgyNjE0MjMwMVowajELMAkGA1UEBhMCRUUxIjAgBgNVBAoTGUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMxITAfBgNVBAsTGFNlcnRpZml0c2VlcmltaXN0ZWVudXNlZDEUMBIGA1UEAxMLRUlELVNLIDIwMDcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDifhEdyvuhk/3TJEGMJ1tEZOskE81yMqPGGXaPHXACJ7fncn1D1uQFt+RG8/ckh7zDquHV1m4HQk7dchaP00rvgsvRlYC9GPcFt6TW8w3t+BkxY1RNbmONgH3qzikljk7m6Nb8UGtL9hOmZdw5k5t9Ht8fgHTnoBkFrxYgsv9d4CCkBTSprNUK+vy/NTak4iAYinWtK6tRHHb1fxRsLUXiDLSO42Kz+rehhslANX+9Y5/h0wlh3pcmxLB1JWAP0O9fV6N1LUQ3Ym7wMp/lBXuPvl52yJuSZDWUF7GkIp+vUifOSefF6CeGh8K9BXDvuOqg+5c/6gkfEQxpRgdu+q5FAgMBAAGjgZwwgZkwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAf4wMwYDVR0fBCwwKjAooCagJIYiaHR0cDovL3d3dy5zay5lZS9jcmxzL2p1dXIvY3JsLmNybDAfBgNVHSMEGDAWgBQEqnpHo+SJrxrPCkCnGD9v7+l9vjAdBgNVHQ4EFgQUHAf0nL+kJWyztJ4iHx+USBtYeo0wDQYJKoZIhvcNAQEFBQADggEBABaiEXv415Oh7AgHODwKRyNFqPcSSOgpLCy1XJB3hl3fi21fslccWuBhfzqHQCiQi0fewh109IJiHq8n1PeKoHBCUVq6NFpxkVsUlUPBr0Qsya1O3SQjuOsBLzUWBvY25dtBuAkBMCo0V1Erf7iTeOzuL4LLbCoeOfeQT3HPmEfSqP5f8V10ST8erbiTVPJwzr66vXaT9YKxy8NyAQc2iaOHuYmGKxs8dgDQRkG6b2a/f5q21YEQKDhvz7VvM6tH+F+rohA2wAvVz4tcPtyw5WEYcavr1KHgz4eZVWsqh2OsHUK9qMas5m/44O1/hXrjpMy5IQsiB4ASXDuXvdOTVbU= - - -CN=EID-SK 2007, OU=Sertifitseerimisteenused, O=AS Sertifitseerimiskeskus, C=EE - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - https://sk.ee/repositoorium/CP/ - https://sk.ee/en/repository/CP/ - - - - - - - - - - - true - - - true - - This service issues qualified certificates for e-signing and e-authentication within the same process. The Relying Party shall make distinction by inspection of keyUsage field contents - e-signature certificates have nonRepudation bit set exclusively. Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) and that has either its nR or its dS bit set is to be considered as supported by an QSCD - - - - - - - - - - true - - All certificates issued under this CA/QC service that have nonRepudiation bit set exclusively are issued as qualified certificates - - - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - -EID-SK 2007: Qualified certificates for Mobile-ID - - - - CN=EID-SK 2007, OU=Sertifitseerimisteenused, O=AS Sertifitseerimiskeskus, C=EE - - - HAf0nL+kJWyztJ4iHx+USBtYeo0= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2007-01-05T11:25:46Z - - - - - - - - - - true - - - true - - This service issues qualified certificates for e-signing and e-authentication within the same process. The Relying Party shall make distinction by inspection of keyUsage field contents - e-signature certificates have nonRepudation bit set exclusively. Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) and that has either its nR or its dS bit set is to be considered as supported by an SSCD - - - - - - - - - true - - All certificates issued under this CA/QC service that have nonRepudiation bit set exclusively are issued as qualified certificates - - - - - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - - EID-SK 2011 qualified certificates for electronic signatures - - - -MIIFADCCA+igAwIBAgIQQyvUTmJDa0ZNgy+/fS0vWjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMB4XDTExMDMxODEwMTExMVoXDTI0MDMxODEwMTExMVowYTELMAkGA1UEBhMCRUUxIjAgBgNVBAoMGUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMxFDASBgNVBAMMC0VJRC1TSyAyMDExMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2Q1zKMt7DytbntSLoYAAVkEwV+5djSr0vSIG/Zm9seKyx+2PY8sVzXRoUD1CMIYnstDhBSKMjn2/+HpA7pOipAIAMrk6uKnpSTTdFbQ+0fzJVPokBgsdsQ6R5TZFPB1nu5zgRRlQmWIFxOpDiNHTt0LObUhWLXzUb31vc1Wmao2IYcDx1TCs/1E9+camiCl2B5lXrPEU3wBq4waD54izS20DK05+6+hHRg+TqoIg5YSmwbjStEyd/8AQeokwVloyyH49bnpeluADcZJgxxE9ZUvVWHoxYfmg1IeRU72jHTcIjNf1cQN2+9/FtHQMnGzDBgmAPpghwWr3JtW0JWvMXAgMBAAGjggGeMIIBmjASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjCB9AYDVR0gBIHsMIHpMIHmBgsrBgEEAc4fZAEBATCB1jCBsAYIKwYBBQUHAgIwgaMegaAASwBhAHMAdQB0AGEAdABhAGsAcwBlACAAZgD8APwAcwBpAGwAaQBzAHQAZQBsAGUAIABpAHMAaQBrAHUAdABlAGwAZQAgAHMAZQByAHQAaQBmAGkAawBhAGEAdABpAGQAZQAgAHYA5ABsAGoAYQBzAHQAYQBtAGkAcwBlAGsAcwAgAGsAbwBtAG0AZQByAHQAcwBhAGwAdQBzAGUAbAAuMCEGCCsGAQUFBwIBFhVodHRwczovL3d3dy5zay5lZS9DUFMwHQYDVR0OBBYEFLEQlwL63YbGeEGkwzKI+/4f58AFMB8GA1UdIwQYMBaAFBLyWj7qVhy/zQas8fElyalL1BSZMD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6Ly93d3cuc2suZWUvcmVwb3NpdG9yeS9jcmxzL2VlY2NyY2EuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQAxau3ohdFkpvaiVUR7arNovQUZRCG9Ge3udqHYemovyU7N60Hgomc/ZG+uunScATTUhBcv9a5zkQxb1dQ1LYDRfNr9CqI0QvSEE4t9Sfu3fOhyLrlmb3s8xhhYLJBJ325uDvtO/qFeXLlcRXMF5nU8FE2IyaZP1CHYKVh5QNPPQiGZGSox5oOkCvmt4lUl4lZUwVie75us/WtrD6DJeREBTEDHORIfg8E9RA1y/7t2gT9vrU8tabeSZlD03qwXe0nJ9RscI/P0HT8vuo1PGzCfbH9xFqfoZ2jdJ0HzxrFM8VsL/AtCw0dmrxRHLlZzqSw0G7b0W40mwOQauO2gbMfn - - -EMAILADDRESS=pki@sk.ee, CN=EID-SK 2011, O=AS Sertifitseerimiskeskus, C=EE - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - https://sk.ee/repositoorium/CP/ - https://sk.ee/en/repository/CP/ - - - - - - - - - - - true - - - true - - This service issues qualified certificates for e-signing and e-authentication within the same process. The Relying Party shall make distinction by inspection of keyUsage field contents - e-signature certificates have nonRepudation bit set exclusively. Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) and that has either its nR or its dS bit set is to be considered as supported by an QSCD - - - - - - - - - - true - - All certificates issued under this CA/QC service that have nonRepudiation bit set exclusively are issued as qualified certificates - - - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - -EID-SK 2011: Qualified certificates for Mobile-ID, organisation cards for natural persons - - - - EMAILADDRESS=pki@sk.ee, CN=EID-SK 2011, O=AS Sertifitseerimiskeskus, C=EE - - - sRCXAvrdhsZ4QaTDMoj7/h/nwAU= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2011-03-18T11:11:11Z - - - - - - - - - - true - - - true - - This service issues qualified certificates for e-signing and e-authentication within the same process. The Relying Party shall make distinction by inspection of keyUsage field contents - e-signature certificates have nonRepudation bit set exclusively. Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) and that has either its nR or its dS bit set is to be considered as supported by an SSCD - - - - - - - - - true - - All certificates issued under this CA/QC service that have nonRepudiation bit set exclusively are issued as qualified certificates - - - - - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - - EID-SK 2016 qualified certificates for electronic signatures - - - -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 - - -CN=EID-SK 2016, OID.2.5.4.97=NTREE-10747013, O=AS Sertifitseerimiskeskus, C=EE - - -nAmoB4cMPawuh/ygrtL7ZUmIKPs= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-12-21T10:00:00Z - - https://sk.ee/repositoorium/CP/ - https://sk.ee/en/repository/CP/ - - - - - - - - - - - - true - - - - 1.3.6.1.4.1.10015.17.2 - - - All certificates issued under this CA/QC service that have nonRepudiation bit set exclusively are issued as qualified certificates - - - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - - KLASS3-SK - - - -MIIEBDCCAuygAwIBAgIEPNkU9TANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAyMDUwODEyMDcxN1oXDTEyMDUwNTExMDcxN1owgY4xGDAWBgkqhkiG9w0BCQEWCXBraUBzay5lZTELMAkGA1UEBhMCRUUxIjAgBgNVBAoTGUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMxITAfBgNVBAsTGFNlcnRpZml0c2VlcmltaXN0ZWVudXNlZDEKMAgGA1UEBRMBMTESMBAGA1UEAxMJS0xBU1MzLVNLMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvIIeK3GJxoPCXVwan+HjJwYGaH3nb/rTPEqg5v9e1c7dnTDBdD2Yteg+lUdHBZDHLj1Tz+J/W9Foc0dzEr96S8+6nMXoonK2x0854JNH2UVbS/+YOGUM6iWSxkHw525tvn5tFaIQoaeh46aQFp9Dngcnv4Gatd0/7NCkLggjFrKmnNTPINpLAG9VoCpVyIMvcVCyTNvSQ+n33ToPO5vtULNYOtCF9MDVND+uNRE2o0tWIG0l84owYPA47tJOLgCpAxLNFR5Ys0nB/ofBYcO+YiCri0yc6t7ZPs/vcfbR6czIwW0GMjyHmVPLB+/WHS3P1sk29DdgIC42RTMthJS6ZQIDAQABo4GZMIGWMA8GA1UdEwQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgHmMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly93d3cuc2suZWUvY3Jscy9qdXVyL2NybC5jcmwwHwYDVR0jBBgwFoAUBKp6R6Pkia8azwpApxg/b+/pfb4wHQYDVR0OBBYEFOU/DJ1xPW+8Gb+a9G6/Cf5A652WMA0GCSqGSIb3DQEBBQUAA4IBAQASvWB+YrgN23EMLW7C5/XUwQLNN1RMDhr6UzOo5XHZ3pxUXq2Erk5ggiS+UJIxkQaSg4OHRru8KTchoJDvS2neeYHOz05zJcAIwoy2GGkHq1iVN+QZaprDaDNYR5GGKgJb3FZrMtyX4dNwnrZzMFzd6t5YibCW+BDPAmqGJvNHzJ5YYdA7I3WT9Baan1ncKd4FtUVb54fppd19NkbCKKSUd7qRYDduNYqVs1C/C0qqLq4TrxoxoxSo+WNLiD01896sIRiPIy8qDOAXJU67382J5XXETe9wZO6o7+NaG0CrpzVY1OaaD2O6Wv/vSpxE2ugqaf0WsP35+coFCWdM2uHZ - - -CN=KLASS3-SK, SERIALNUMBER=1, OU=Sertifitseerimisteenused, O=AS Sertifitseerimiskeskus, C=EE, EMAILADDRESS=pki@sk.ee - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - https://sk.ee/repositoorium/CP/ - https://sk.ee/en/repository/CP/ - - - - - - - - - - - true - - Any certificate that is issued under the CA/QC Sdi certificate and that is issued as a QC (i.e. containing a QcCompliance statement) and having its non-repudation bit set exclusively, is to be considered as supported by an SSCD. They are issued for digital stamping according to Estonian Digital Signature Act - - - - - - - - - true - - - false - - Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) is to be considered as issued to a Legal Person - - - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - -KLASS3-SK: Qualified electronic seals - - - - CN=KLASS3-SK, SERIALNUMBER=1, OU=Sertifitseerimisteenused, O=AS Sertifitseerimiskeskus, C=EE, EMAILADDRESS=pki@sk.ee - - - 5T8MnXE9b7wZv5r0br8J/kDrnZY= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2002-05-08T12:07:17Z - - - - - - - - - - true - - - false - - Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) is to be considered as issued to a Legal Person - - - - - - - - - true - - Any certificate that is issued under the CA/QC Sdi certificate and that is issued as a QC (i.e. containing a QcCompliance statement) and having its non-repudation bit set exclusively, is to be considered as supported by an SSCD. They are issued for digital stamping according to Estonian Digital Signature Act - - - - - - - - - true - - All certificates issued under this CA/QC service that have nonRepudiation bit set exclusively are issued as qualified certificates - - - - - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - - Klass3-SK 2010 qualified certificate for electronic seal - - - -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 - - -CN=KLASS3-SK 2010, OU=Sertifitseerimisteenused, O=AS Sertifitseerimiskeskus, C=EE - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:01:00Z - - https://sk.ee/en/repository/CP/ - https://sk.ee/repositoorium/CP/ - - - - - - - - - - - true - - - - 0.4.0.194112.1.3 - - - Any certificate that is issued under the CA/QC Sdi certificate and that is issued as a QC (i.e. containing a QcCompliance statement) and having its Certificate Policy PolicyIdentifier OID set as 0.4.0.194112.1.3, is to be considered as supported by a QSCD. They are issued for digital stamping according to eIDAS regulation - - - - - - - - - true - - - false - - Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) is to be considered as issued to a Legal Person - - - - - - - - - true - - All certificates issued under this CA/QC service that have nonRepudiation bit set exclusively are issued as qualified certificates - - - - - - - - - true - - - - - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSeals - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - -KLASS3-SK 2010 - - - - CN=KLASS3-SK 2010, OU=Sertifitseerimisteenused, O=AS Sertifitseerimiskeskus, C=EE - - - XXUUEYz0pY5Cj3uyQESj7tZ6O3I= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - - - - - - - - - true - - Any certificate that is issued under the CA/QC Sdi certificate and that is issued as a QC (i.e. containing a QcCompliance statement) and having its Certificate Policy PolicyIdentifier OID set as 0.4.0.194112.1.3, is to be considered as supported by a QSCD. They are issued for digital stamping according to eIDAS regulation - - - - - - - - - true - - - false - - Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) is to be considered as issued to a Legal Person - - - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - -KLASS3-SK 2010: Qualified electronic seals - - - - CN=KLASS3-SK 2010, OU=Sertifitseerimisteenused, O=AS Sertifitseerimiskeskus, C=EE - - - XXUUEYz0pY5Cj3uyQESj7tZ6O3I= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2010-03-31T09:17:28Z - - - - - - - - - - true - - - false - - Any certificate issued under the CA/QC Sdi certificate and is issued as a QC (i.e. containing a QcCompliance statement) is to be considered as issued to a Legal Person - - - - - - - - - true - - Any certificate that is issued under the CA/QC Sdi certificate and that is issued as a QC (i.e. containing a QcCompliance statement) and having its non-repudation bit set exclusively, is to be considered as supported by an SSCD. They are issued for digital stamping according to Estonian Digital Signature Act - - - - - - - - - true - - All certificates issued under this CA/QC service that have nonRepudiation bit set exclusively are issued as qualified certificates - - - - - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - - ESTEID-SK OCSP RESPONDER 2005 - - - -MIIDPDCCAiSgAwIBAgIEQi2iwTANBgkqhkiG9w0BAQUFADB8MRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMQ8wDQYDVQQLEwZFU1RFSUQxCjAIBgNVBAQTATExEjAQBgNVBAMTCUVTVEVJRC1TSzAeFw0wNTAzMDgxMzA0MDFaFw0xMjAxMTIxMzA0MDFaMG8xCzAJBgNVBAYTAkVFMQ8wDQYDVQQKEwZFU1RFSUQxDTALBgNVBAsTBE9DU1AxJjAkBgNVBAMTHUVTVEVJRC1TSyBPQ1NQIFJFU1BPTkRFUiAyMDA1MRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAI8mLeLkRHLxMNCB5Pz8R5DnvPdVxBS91PoHboLnbhjlp1ecByVosjwGpXCGu8tUPuv81Azgqq97AsSugM1J7Pu0gj4bg0Mf6O/9XyoT7RI7H0BuEn4KJQlFcw7tXizI5KUWFFZ4Qg8kfg0xwrDrLIjusBtRbeRARG3DhH8dgZBpAgMBAAGjVzBVMBMGA1UdJQQMMAoGCCsGAQUFBwMJMB8GA1UdIwQYMBaAFHgXtQX5s1jNWYzeZ15EBkx1hmldMB0GA1UdDgQWBBRM+GJhloJeOPpJDgvA0clxQXdnVTANBgkqhkiG9w0BAQUFAAOCAQEAfD8dP+swtSeigLxL3uUXV/tmQkjre7Ww39Uey71LdtxQ6zC7MDjcsLW13JaU0pRuu/p/eGe6h4/w46tSMsBx/U+D1WnHeCj1ED9SFWwfNQFVz9FkM5JEkPDm7lw5hHoxIghRHAC3NMbR3sCrVQA2YELf2WypslROoz8XlRT1LN4pwVehpBeWO7xbQPUtoaxKrSCGumtxtxA3KRJ7POHPTAH4cvipxaZhS1ZcXbKtxsesGW+7KLZirpTBT17ICXEA1CFXDWmJ8MHRhbeNWK3G1PERgTiGtBQV7Z00CzmJPHmb1yfcT27+WZ1W9tRQsjhGEWyMVkNnZooWHIjLpNucQA== - - -EMAILADDRESS=pki@sk.ee, CN=ESTEID-SK OCSP RESPONDER 2005, OU=OCSP, O=ESTEID, C=EE - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - http://ocsp.sk.ee - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - -OCSP, ESTEID-SK OCSP RESPONDER 2005 - - - - EMAILADDRESS=pki@sk.ee, CN=ESTEID-SK OCSP RESPONDER 2005, OU=OCSP, O=ESTEID, C=EE - - - TPhiYZaCXjj6SQ4LwNHJcUF3Z1U= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2005-03-08T14:04:01Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - - ESTEID-SK 2007 OCSP RESPONDER - - - -MIIDnDCCAoSgAwIBAgIERZ0acjANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEPMA0GA1UECxMGRVNURUlEMRcwFQYDVQQDEw5FU1RFSUQtU0sgMjAwNzAeFw0wNzAxMDQxNTE3MDZaFw0xMDAxMDgxNTE3MDZaMG8xCzAJBgNVBAYTAkVFMQ8wDQYDVQQKEwZFU1RFSUQxDTALBgNVBAsTBE9DU1AxJjAkBgNVBAMTHUVTVEVJRC1TSyAyMDA3IE9DU1AgUkVTUE9OREVSMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJmoB3SJCpPzcoHNqK1J0tRNQjgr5iuB27uE1VacIbITjD/Nc1AefKz5ydNPIaBNehm4yKxBYGxEeWOSJHVXyhJMg53EAUOw/45c46gvznXupHuJ6TEiGjh1pxaXTeLSnTqzNDZDAGQsOTgIbwGLa5U5ad8rXYu2YkJKsAfo6jT5AgMBAAGjgdcwgdQwEwYDVR0lBAwwCgYIKwYBBQUHAwkwEgYJKwYEBQUHMAEFBAUwAwQBMDCBiQYDVR0jBIGBMH+AFEgG3r6Mh1eVgHhj+pwjKyugOhh1oWGkXzBdMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLggRFm6ANMB0GA1UdDgQWBBRJ/snw1GDL3fUH9n9Cpn8yhXiC7DANBgkqhkiG9w0BAQUFAAOCAQEAYzGkZD/uaXlWPeye1z5IiI83nmAjiJyvoj/r3BB9ZFWMX+ZY4Fz6/V/fzD0xXoeDpWbBKxcuctPXzXYxEH17n0/3yGOz8jhdJNBUCwRmd+96oHsU9aWSf+D2tiq1jPw6HVCiUYOhC/OWjg/+JpFlWsBV4gTW8/2PSGig85XlEsWLK7i7tIe60nnw/rWnfbCckMRcbrAF1L/JIlnUYUdkGOGQ9KPVqwR/MyWrwFIcSy2QIbcIaWMuiUc1nt8bmIXKoFZxbLzXYC00zba9cY7lSC4WPuhBtrQJ9JWb4OeoXd5j6O45UaH6XbarfrhER1GHL06cTyksT18p2L2GrMuEJg== - - -EMAILADDRESS=pki@sk.ee, CN=ESTEID-SK 2007 OCSP RESPONDER, OU=OCSP, O=ESTEID, C=EE - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - http://ocsp.sk.ee - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - -OCSP, ESTEID-SK 2007 OCSP RESPONDER - - - - EMAILADDRESS=pki@sk.ee, CN=ESTEID-SK 2007 OCSP RESPONDER, OU=OCSP, O=ESTEID, C=EE - - - Sf7J8NRgy931B/Z/QqZ/MoV4guw= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2007-01-04T16:17:06Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - - ESTEID-SK 2007 OCSP RESPONDER 2010 - - - -MIIEkjCCA3qgAwIBAgIESxUPmTANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEPMA0GA1UECxMGRVNURUlEMRcwFQYDVQQDEw5FU1RFSUQtU0sgMjAwNzAeFw0wOTEyMDExMjQ1MDBaFw0xNjA4MjYxMzIzMDBaMIGHMQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czENMAsGA1UECwwET0NTUDErMCkGA1UEAwwiRVNURUlELVNLIDIwMDcgT0NTUCBSRVNQT05ERVIgMjAxMDEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA48pyM/QfeiU1Kbu4AdcAUKXBiwbYbBl4gCltZHC5fZ77fKj2mqfPX2/XW1EqzbVvG0PYIkapkQzBr3R1S6Uaxh1DLC2Cc8BRnqmhXoE03o8En7N9xpN9dGGDBHp2aElBcVVZnAvF4jgbPDCNFAeo3cvpjIx18n0URiVOZFEdxDvF8PFo/exKXtjRM+jk3K6+9doHYvSXn9klFbT8Wge87Qdll3gQzZE3L8QMXF0z4xbBH1lyTmVLt5yZ0fxoE0jNlZFvn2w2EDnU4CKfId8w6Zjd5kdxomcwDzGuuLzdiJllPt05USJcY4FHn9YAVKWmofYY/o6xOUzU8fAz6yA1tQIDAQABo4IBLzCCASswEwYDVR0lBAwwCgYIKwYBBQUHAwkwaQYDVR0gBGIwYDBeBgorBgEEAc4fBAECMFAwJQYIKwYBBQUHAgIwGRoXU0sgdGltZSBzdGFtcGluZyBwb2xpY3kwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuc2suZWUvYWphdGVtcGVsLzCBiQYDVR0jBIGBMH+AFEgG3r6Mh1eVgHhj+pwjKyugOhh1oWGkXzBdMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLggRFm6ANMB0GA1UdDgQWBBQ4AhAwumZ6EXROIl5wZQXedXpOFDANBgkqhkiG9w0BAQUFAAOCAQEAJ/LvPUevNRcBp+J78fZRofhk/ifKNLxCUoh8T3MjtU9u5R0KojRlye+1NU8MqH/zrKhr6TPxuXD0cRrFQ9Hy60II7IzzaegrQVNgq7UgQINvCuNxWZcGtEa3ba9M7tBpQeFxqp3CpBytGeVuXn65hqOBKdp/zYEiMUUkYNAT5A6SSPYLAOgARCI/ydBx+cw0l0fwYvw72FKZa2Mlt5DmXBccCtrQ4l/sb95xfANCNe5n5sBvBhY4F+sIWZUVJ8fTVh7iGaVPSayQfeAAei0m/4/ksiXBwfx6qhzyB3yqcnSk489oBrrCegua/t+3LizfHpNZvDphKMPuAZ4uheLfQA== - - -EMAILADDRESS=pki@sk.ee, CN=ESTEID-SK 2007 OCSP RESPONDER 2010, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - http://ocsp.sk.ee - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - -OCSP, ESTEID-SK 2007 OCSP RESPONDER 2010 - - - - EMAILADDRESS=pki@sk.ee, CN=ESTEID-SK 2007 OCSP RESPONDER 2010, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE - - - OAIQMLpmehF0TiJecGUF3nV6ThQ= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2009-12-01T13:45:00Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - - EID-SK 2007 OCSP RESPONDER - - - -MIIDOjCCAiKgAwIBAgIERh9YjTANBgkqhkiG9w0BAQUFADBqMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEhMB8GA1UECxMYU2VydGlmaXRzZWVyaW1pc3RlZW51c2VkMRQwEgYDVQQDEwtFSUQtU0sgMjAwNzAeFw0wNzA0MTMxMDE2NDVaFw0xMDA0MTcwOTE2NDVaMH8xCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMQ0wCwYDVQQLEwRPQ1NQMSMwIQYDVQQDExpFSUQtU0sgMjAwNyBPQ1NQIFJFU1BPTkRFUjEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD+Z0LZ6TjBzx4x+UshExea1nIMsS86xAN6u/amLV8XQE+vodEld8iqtRsrvFiQ74isYOys1JKqiq+1ryic6j2FnMDZueLiXZl51QWyuhWu+aT4BwEaA8rUxMgKJ94zWksrqSf9cjoaap+9DlDhEsrDa+/89CPl2rlZIB5lqeHLQQIDAQABo1cwVTATBgNVHSUEDDAKBggrBgEFBQcDCTAfBgNVHSMEGDAWgBQcB/Scv6QlbLO0niIfH5RIG1h6jTAdBgNVHQ4EFgQUMsMzikmZqG6CcdgnD5VAXfQeCrgwDQYJKoZIhvcNAQEFBQADggEBAH0eUFQ7LznD4R8XWj/6rsNhe0fme3Os7cyZGNkx1EWenkgdMHCV/gN3SyIfrjW7sEJM62sS1X+8Ke2J+6b5YH0TcSmSDqYICn6zVbsq5MLtHW5wmwKucBJ5xFgoC3NNCEp8wVrzuQmm6xCvFWQVQ6uNhjuxCQxcDKgLwpL7iEcBEMmTTKkvqEtqrvu/LZ/a2OHytkEoXGheN8KlEcIv7AJBPVL8OCv4UpgyUOrVnmIeX2F/KG3wmo4U3kVupuF9kaPrOeOGYG3ZzK2HNwfRNkZ/Ej7AuPazkumAHdsJBbpTdBYq8d8er8XZKai24Ra/e5eEmcMye+O8IpxAA4ExY+I= - - -EMAILADDRESS=pki@sk.ee, CN=EID-SK 2007 OCSP RESPONDER, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - http://ocsp.sk.ee - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - -OCSP, EID-SK 2007 OCSP RESPONDER - - - - EMAILADDRESS=pki@sk.ee, CN=EID-SK 2007 OCSP RESPONDER, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE - - - MsMzikmZqG6CcdgnD5VAXfQeCrg= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2007-04-13T10:16:45Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - - EID-SK 2007 OCSP RESPONDER 2010 - - - -MIIEMTCCAxmgAwIBAgIESxUA8TANBgkqhkiG9w0BAQUFADBqMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEhMB8GA1UECxMYU2VydGlmaXRzZWVyaW1pc3RlZW51c2VkMRQwEgYDVQQDEwtFSUQtU0sgMjAwNzAeFw0wOTEyMDExMTQxMzBaFw0xNjA4MjYxMzIzMDBaMIGEMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czENMAsGA1UECxMET0NTUDEoMCYGA1UEAxMfRUlELVNLIDIwMDcgT0NTUCBSRVNQT05ERVIgMjAxMDEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAso91KG7EHsjAxMairaCKUHSOyXp5rzxRq5Y9LfDyplVbHfh34fbB7M5G+wnu5CZgJsfJ7DF3MjpA7nlAHd5alAynIUl/CNXejf+XnJ/vyF1eQvAoWvnjBPVIS0mbaABgF54ybAGE2E7UKeZVOAj7RoQVAMHQcYVjxZW5OWz3yJX9KdaDZPOzqlGtRYKUASHiwAFwExKcqfaHOj0qO8+KdSvEBaVlpe5kunEVEvn+kgNKBtzdH2XFMjVFa4im31KW+iq7mNQwUiZDSe9ho6T6UrWu7g8yTQowx3SYLTqVxR0YVgcYNCx7nn1AVGNxK3oeonrHHqcBp6qSAIYXeQNfiQIDAQABo4HDMIHAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMGkGA1UdIARiMGAwXgYKKwYBBAHOHwQBAjBQMCUGCCsGAQUFBwICMBkaF1NLIHRpbWUgc3RhbXBpbmcgcG9saWN5MCcGCCsGAQUFBwIBFhtodHRwOi8vd3d3LnNrLmVlL2FqYXRlbXBlbC8wHwYDVR0jBBgwFoAUHAf0nL+kJWyztJ4iHx+USBtYeo0wHQYDVR0OBBYEFPBOCDPMR+kfp7Ozk5U68E68/AseMA0GCSqGSIb3DQEBBQUAA4IBAQCRaqmxZgJiJ+MLamb/P4vyS6azr6/tj8dZCK++V/3GnecRm7CiZpR47EnW0NyDzCecGyTWSkVlnZPnNvXRx700Nn0M4Inia5pNhSuVmWS3p5eV70vCbsfRD26+6CZhkHWnL/J2xpqeacULtgPPz9gBTyC2ybQr17dv7W5Qc+3UFywmE5N8ozQuEJroGz7P+yCbBEssWcmIUNDNdO0xs6aQZ1f+DV4FUB0lajuILYFz4xM+81akYFVqaGPCVwbQgFSWRKmamj8FxfWjA4DCrgkHVR1rA3tZyirfCBK9cfWpTCLr8zq9Ur0jTAeGrHRzHlUrB9mYZwyr0kNOyl9293xh - - -EMAILADDRESS=pki@sk.ee, CN=EID-SK 2007 OCSP RESPONDER 2010, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - http://ocsp.sk.ee - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - -OCSP, EID-SK 2007 OCSP RESPONDER 2010 - - - - EMAILADDRESS=pki@sk.ee, CN=EID-SK 2007 OCSP RESPONDER 2010, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE - - - 8E4IM8xH6R+ns7OTlTrwTrz8Cx4= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2009-12-01T12:41:30Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - - KLASS3-SK OCSP RESPONDER 2009 - - - -MIIDzzCCAregAwIBAgIEScskSjANBgkqhkiG9w0BAQUFADCBjjEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEhMB8GA1UECxMYU2VydGlmaXRzZWVyaW1pc3RlZW51c2VkMQowCAYDVQQFEwExMRIwEAYDVQQDEwlLTEFTUzMtU0swHhcNMDkwMzI2MDY0NDI2WhcNMTIwNTA0MDU0NDI2WjCBgjELMAkGA1UEBhMCRUUxIjAgBgNVBAoTGUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMxDTALBgNVBAsTBE9DU1AxJjAkBgNVBAMTHUtMQVNTMy1TSyBPQ1NQIFJFU1BPTkRFUiAyMDA5MRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKi6weNl7Wj7sL6JD4YUNt/JXQ79KL53x5m4QGRsijGJaV5YggE5rJyVZGlsX4FSd9JFIV597ypAUGDbLPf0nDdlSIGteP7zamyETI3GI6bKfkeUuIE707r7uC+8FFe9iHOOL20+pi7WFzwnyXT9yuWs0eCoKdjQvLpMiq0MBIm9AgMBAAGjgcIwgb8wEwYDVR0lBAwwCgYIKwYBBQUHAwkwaAYDVR0gBGEwXzBdBgorBgEEAc4fBAECME8wJQYIKwYBBQUHAgIwGRoXU0sgdGltZSBzdGFtcGluZyBwb2xpY3kwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuc2suZWUvYWphdGVtcGVsMB8GA1UdIwQYMBaAFOU/DJ1xPW+8Gb+a9G6/Cf5A652WMB0GA1UdDgQWBBT59PTkSIzYXNBxQQnAhqH3BtED0TANBgkqhkiG9w0BAQUFAAOCAQEAhyl3H6fo1bz3mD0JcD4eY1slcwec92Qgkn6i9TsO5TlDQCJxiC/80zlh+H5dgIMcNQ6gNbr1cWsUw7xAanv2hGlg20IWq7uCyy5LDghFpO2BWDzTJjmiVTXzyVEvqST0W6efDiwi1tA8H7b+aAzc9ItWm7pYlucGvneKJq07t/UvU9ONSDUfVLPNMr8slwCMOexVDZ+eiBlvrLL3N7NouPs7UpFh/+m5JsERmeLbbrNYimHUUn2PJ/trJ3kBEVFToO+nFdBElfzC3bjSlbPXFxSOL+AqSgvRIaB4CEWUxa33wzoZNaVpCh5AupxQOGdr4u7ajw5hkV8Y9VZ7OFej6A== - - -EMAILADDRESS=pki@sk.ee, CN=KLASS3-SK OCSP RESPONDER 2009, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:01:00Z - - http://ocsp.sk.ee - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSeals - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - -KLASS3-SK OCSP RESPONDER 2009 - - - - EMAILADDRESS=pki@sk.ee, CN=KLASS3-SK OCSP RESPONDER 2009, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE - - - +fT05EiM2FzQcUEJwIah9wbRA9E= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - -OCSP, KLASS3-SK OCSP RESPONDER 2009 - - - - EMAILADDRESS=pki@sk.ee, CN=KLASS3-SK OCSP RESPONDER 2009, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE - - - +fT05EiM2FzQcUEJwIah9wbRA9E= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2009-03-26T07:44:26Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - - KLASS3-SK 2010 OCSP RESPONDER - - - -MIIELzCCAxegAwIBAgICAMswDQYJKoZIhvcNAQEFBQAwbTELMAkGA1UEBhMCRUUxIjAgBgNVBAoTGUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMxITAfBgNVBAsTGFNlcnRpZml0c2VlcmltaXN0ZWVudXNlZDEXMBUGA1UEAxMOS0xBU1MzLVNLIDIwMTAwHhcNMTAwNDA4MDgwMTMxWhcNMTYwODI1MjIwMDAwWjCBgjEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czENMAsGA1UECxMET0NTUDEmMCQGA1UEAxMdS0xBU1MzLVNLIDIwMTAgT0NTUCBSRVNQT05ERVIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDhWwGpngF0sdGCgOgiyT12A/Vdm9sMPr/cUwZhU7DA5C8rU1yJhbrh28fMpv0eas6/+IC1oDxI24zjfWIKfHwpBmhUTFsmvmKRIu4a1F6VwNwYEdoAZrQDpzZSve6H6R/+0Uy0BAolebdhPUK22pKd8V1CBY3de886Ray8uUJu09MAU8j+xsoUNOzyxiWdAVp1YTXRhhUt+EQVYJ22RBZ6+b9fPQvgb9aWgE/WwqUh7OrgTnrGZVzgO46prfE7zkALG0FYZCzQTCMH8aIqqte0E3HwSVlKh9qwbRPB9WTDCtCqajh4qgGRTXvWT4vATlHvx8GpJ3roZkp5AlQno3hTAgMBAAGjgcIwgb8waAYDVR0gBGEwXzBdBgorBgEEAc4fBAECME8wJQYIKwYBBQUHAgIwGRoXU0sgdGltZSBzdGFtcGluZyBwb2xpY3kwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuc2suZWUvYWphdGVtcGVsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMB8GA1UdIwQYMBaAFF11FBGM9KWOQo97skBEo+7WejtyMB0GA1UdDgQWBBQ3MJkXG2Go/6j4bem465aue3P5qjANBgkqhkiG9w0BAQUFAAOCAQEAKhoVTII1ECecFkyt9Ogr0XW3WEFprrqTDE4IycMlx+LNjWk30aknMldEtzIC5nCDX27NCWkpbN1o/3ddBv0cKMa05ZK8sHQxU6A5Oev8DCp72/LFEChq5IDqgqW2BiHhyfPfr93JIuV03b/Wgq3fpRyBd21VE9254W4A90xeNxDvdpqxlrD2Lonzm/V/oomzEHsp4kKxXkPmRU4vGtTnxxAnxYp9OuLkvpUCLNoAWMbYqb4cbYzaZ9tQIkBy3nJ352Rs5obYDb3R/ZVWuYLLSocWL7b2QwlDP7LA8VNDqmQvioHt8GcyKXQ5/eWMvj2ePt58waVhwfSdd4nANKtq1g== - - -CN=KLASS3-SK 2010 OCSP RESPONDER, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE, EMAILADDRESS=pki@sk.ee - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:01:00Z - - http://ocsp.sk.ee - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSeals - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - -KLASS3-SK 2010 OCSP RESPONDER - - - - CN=KLASS3-SK 2010 OCSP RESPONDER, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE, EMAILADDRESS=pki@sk.ee - - - NzCZFxthqP+o+G3puOuWrntz+ao= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - -OCSP, KLASS3-SK 2010 OCSP RESPONDER - - - - CN=KLASS3-SK 2010 OCSP RESPONDER, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE, EMAILADDRESS=pki@sk.ee - - - NzCZFxthqP+o+G3puOuWrntz+ao= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2010-04-08T08:01:31Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - - SK OCSP RESPONDER 2011 - - - -MIIEvDCCA6SgAwIBAgIQcpyVmdruRVxNgzI3N/NZQTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMB4XDTExMDMxODEwMjE0M1oXDTI0MDMxODEwMjE0M1owgZ0xCzAJBgNVBAYTAkVFMQ4wDAYDVQQIEwVIYXJqdTEQMA4GA1UEBxMHVGFsbGlubjEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czENMAsGA1UECxMET0NTUDEfMB0GA1UEAxMWU0sgT0NTUCBSRVNQT05ERVIgMjAxMTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAihvGyhMVrgReHluKln1za6gvCE/mlSREmWjJFpL9llvuEUZoPFIypYA8g5u1VfgkeW5gDq25jAOq4FyXeDGIa+pJn2h0o2Wc2aeppVG/emfGm/jA8jjeyMrwH8fAJrqVQ7c9X2xSwJEch/P2d8CfMZt5YF6gqLtPvG1b+n6otBZA5wjIFfJ/inJBMUvqHSz3+PLfxO2/T3Wyk/c8M9HIMqTelqyiMGRgWehiU1OsL9armv3dQrHs1wm6vHaxfpfWB9YAFpeo9aYqhPCxVt/zo2NQB6vxyZS0hsOrXL7SxRToOJaqsnvlbf0erPPFtRHUvbojYYgl+fzlz0Jt6QJoNwIDAQABo4IBHTCCARkwEwYDVR0lBAwwCgYIKwYBBQUHAwkwHQYDVR0OBBYEFKWhSGFt537NmJ50nCm7vYrecgxZMIGCBgNVHSAEezB5MHcGCisGAQQBzh8EAQIwaTA+BggrBgEFBQcCAjAyHjAAUwBLACAAdABpAG0AZQAgAHMAdABhAG0AcABpAG4AZwAgAHAAbwBsAGkAYwB5AC4wJwYIKwYBBQUHAgEWG2h0dHBzOi8vd3d3LnNrLmVlL2FqYXRlbXBlbDAfBgNVHSMEGDAWgBQS8lo+6lYcv80GrPHxJcmpS9QUmTA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vd3d3LnNrLmVlL3JlcG9zaXRvcnkvY3Jscy9lZWNjcmNhLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAw2sKwvTHtYGtD8Jw9mNUuj/mWiBSBEBeY2LhW8V6tjBPAPp3s6iWOh0FbVR2LUyrqRwgT3fyWiGsiDm/6cIqM+IblLp/8ztfRQjquhW6XCD9SK02OQ9ZSdBwcmoAApZLGXQC34wdgmV/hLTTNxONnDACBKz9U+Dy9a4ZT4tpNkbH8jq/BMne8FzbvRt1bjpXBP7gjLX+zdx8/hp0Wq4tD+f9NVX0+vm9ahEKuzx4QzPnSB7hhWM9OnLZT7noRQa+KWk5c+e5VoR5R2t7MjVl8Cd+2llxiSxqMSbU5/23BzAKgN+NQdrBZAzpZ7lfaAuLFaICP+bAm6uW2JUrM6abOw== - - -EMAILADDRESS=pki@sk.ee, CN=SK OCSP RESPONDER 2011, OU=OCSP, O=AS Sertifitseerimiskeskus, L=Tallinn, ST=Harju, C=EE - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - http://ocsp.sk.ee - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - -OCSP, SK OCSP RESPONDER 2011 - - - - EMAILADDRESS=pki@sk.ee, CN=SK OCSP RESPONDER 2011, OU=OCSP, O=AS Sertifitseerimiskeskus, L=Tallinn, ST=Harju, C=EE - - - paFIYW3nfs2YnnScKbu9it5yDFk= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2011-03-18T11:21:43Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - - SK Proxy OCSP Responder 2009 - - - -MIIEUjCCAzqgAwIBAgIESg1N9TANBgkqhkiG9w0BAQUFADCBjjEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEhMB8GA1UECxMYU2VydGlmaXRzZWVyaW1pc3RlZW51c2VkMQowCAYDVQQFEwExMRIwEAYDVQQDEwlLTEFTUzMtU0swHhcNMDkwNTE1MTExMTQ5WhcNMTIwNTA1MTEwNzE3WjCBgTELMAkGA1UEBhMCRUUxIjAgBgNVBAoTGUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMxDTALBgNVBAsTBE9DU1AxJTAjBgNVBAMTHFNLIFByb3h5IE9DU1AgUmVzcG9uZGVyIDIwMDkxGDAWBgkqhkiG9w0BCQEWCXBraUBzay5lZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ6rr1AZFPunWKMJAse70wx9Utc57qgbrJdk8iiOrcUN2FApNal2wFnRIw9rsF8u9KPu3g47ZSuKKYkpdVVupTwt6gK+brQczfQShO3xOCj7cubcl5+6jDPXSh47zma10hh4tJ5VECOiCDBhIRfA/UJfMYj6BYgEhFuRQxEBgAF5yyEJX1X8Sco/GQcha4Er5SyEhHvXu/vvg0OVfLRqH/7gGBBRLPMOsDImmXf+C0UYKs7ywFBf+M0VnWH9u0p7E8XzA8s3m2ivTdU/JYIU5Zy7NFeV9NJgZw3iaLCO1dbV2gBIWpgGvqlwQ3coKHMs3tMBT25+WWmKVMsHFi254ysCAwEAAaOBwjCBvzATBgNVHSUEDDAKBggrBgEFBQcDCTBoBgNVHSAEYTBfMF0GCisGAQQBzh8EAQIwTzAlBggrBgEFBQcCAjAZGhdTSyB0aW1lIHN0YW1waW5nIHBvbGljeTAmBggrBgEFBQcCARYaaHR0cDovL3d3dy5zay5lZS9hamF0ZW1wZWwwHwYDVR0jBBgwFoAU5T8MnXE9b7wZv5r0br8J/kDrnZYwHQYDVR0OBBYEFCRXW4FmpJ/GGw3/AXu5czpgogbJMA0GCSqGSIb3DQEBBQUAA4IBAQB9U7sG/M/w7eXBQh5tDOZ7XLCRmhrmGk9+1RdAP54SmMzc1nnglmfgl13ncaizPleu0p8541a51XCYqQMJbry47YkEnq48ImiAjEpkbaCZsZhX06uUpA9DlstEW/wBZzSCUoGsklbBolwTWAP97B7trizPe102hNvD5IMaXrMqaH9hQcoYmKyJHBQnxW2bXxYjeXvIDcAQvevLP8IIOLqdib029GFcM7U889FaBcO4cPxx4kITXC2hAvdiZwGuDVAz15Byl8RAfNWrlmv+IBRSQpAecnLYozJYyRNcFPrYLd9aXbej6p6sRCHgC452czoM0VbMmisrK8pm6yZ0J1r+ - - -EMAILADDRESS=pki@sk.ee, CN=SK Proxy OCSP Responder 2009, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - http://ocsp.sk.ee - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - -OCSP, SK Proxy OCSP Responder 2009 - - - - EMAILADDRESS=pki@sk.ee, CN=SK Proxy OCSP Responder 2009, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE - - - JFdbgWakn8YbDf8Be7lzOmCiBsk= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2009-05-15T11:11:49Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - - ESTEID-SK OCSP RESPONDER - - - -MIIDuDCCAqCgAwIBAgIEPJilyDANBgkqhkiG9w0BAQUFADB8MRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMQ8wDQYDVQQLEwZFU1RFSUQxCjAIBgNVBAQTATExEjAQBgNVBAMTCUVTVEVJRC1TSzAeFw0wMjAzMjAxNTA3NTJaFw0wNTAzMjQxNTA3NTJaMGoxCzAJBgNVBAYTAkVFMQ8wDQYDVQQKEwZFU1RFSUQxDTALBgNVBAsTBE9DU1AxITAfBgNVBAMTGEVTVEVJRC1TSyBPQ1NQIFJFU1BPTkRFUjEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC10BeCObXZZWcDX298Wqfd16hpi9tuSbT4L+kowTj+aWz7PDsFpKQWqhxCdlicu67xCT0zAAjaK6x9cwasiIdre++IkscRi00w20G5nTPocxpwGTHqwHx4ED7cceK4t4pbj/zB8FluVNVii8ouG9ZEhH76j/Icx0X27Sq5AS0CwwIDAQABo4HXMIHUMBMGA1UdJQQMMAoGCCsGAQUFBwMJMBIGCSsGBAUFBzABBQQFMAMEATAwgYkGA1UdIwSBgTB/gBR4F7UF+bNYzVmM3mdeRAZMdYZpXaFhpF8wXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TS4IEPERcgjAdBgNVHQ4EFgQUzpYj2gwlDYK9ahyGyKa0AkK5ys0wDQYJKoZIhvcNAQEFBQADggEBADrq0tGkwsrddEqUbsOpXi75Xs4GVkOyseysNqZZCvLqCF7qTSMiC+fzRxQbXQDhuOT7QQvi3JAoA5zTIm2RvIO1fmrVnJ6CsObjxxvXtcSLI+bICG4uQYgEA+duDRgICpmtCCjtmxb+2/cSJLGioaKiwn0YwgeEowOgjDMh2o4otm6FjtyT1GZsZm56U7WkFa7tSwkHKw427iZUWVrED6W9AfATY14rNnAk8Jqz06w4rPnGE4kYjO+UqMLmFU2KImdrTp1O7h4YLCVlxH/e/He8r7FSgzXSG4EqlD/TMEdCLu7DSWR3SEgJPvKWCpNWzv2DRldHp+kQO3k+R/f2c80= - - -EMAILADDRESS=pki@sk.ee, C=EE, O=ESTEID, OU=OCSP, CN=ESTEID-SK OCSP RESPONDER - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - http://ocsp.sk.ee - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - -OCSP, ESTEID-SK OCSP RESPONDER - - - - EMAILADDRESS=pki@sk.ee, CN=ESTEID-SK OCSP RESPONDER, OU=OCSP, O=ESTEID, C=EE - - - zpYj2gwlDYK9ahyGyKa0AkK5ys0= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2002-03-20T16:07:52Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP - - KLASS3-SK OCSP RESPONDER (2003) - - - -MIIDXTCCAkWgAwIBAgIEPolzuzANBgkqhkiG9w0BAQUFADCBjjEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEhMB8GA1UECxMYU2VydGlmaXRzZWVyaW1pc3RlZW51c2VkMQowCAYDVQQFEwExMRIwEAYDVQQDEwlLTEFTUzMtU0swHhcNMDMwNDAxMTExMDUxWhcNMDYwNDA1MTAxMDUxWjB9MQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czENMAsGA1UECxMET0NTUDEhMB8GA1UEAxMYS0xBU1MzLVNLIE9DU1AgUkVTUE9OREVSMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALXQF4I5tdllZwNfb3xap93XqGmL225JtPgv6SjBOP5pbPs8OwWkpBaqHEJ2WJy7rvEJPTMACNorrH1zBqyIh2t774iSxxGLTTDbQbmdM+hzGnAZMerAfHgQPtxx4ri3iluP/MHwWW5U1WKLyi4b1kSEfvqP8hzHRfbtKrkBLQLDAgMBAAGjVzBVMBMGA1UdJQQMMAoGCCsGAQUFBwMJMB8GA1UdIwQYMBaAFOU/DJ1xPW+8Gb+a9G6/Cf5A652WMB0GA1UdDgQWBBTOliPaDCUNgr1qHIbIprQCQrnKzTANBgkqhkiG9w0BAQUFAAOCAQEAd/8FCyPC9zXxcAZN67KCNU4+XNJ8e+LmG602lBe+lS7Pw4pOgMKebgULKh1fEBHQ2K7FSUWMZdPWkDHaKVRh646yVbFZbfEmKNq4LhRf13/hoUdrG5uRVmCsV03WSfgfUVfb1cZf8tDMIwCmsNXu22k9wykeHallpUmGUfbVZygqfKE2NVQpm2FULiKWBFKXqbMtW5R3xmDS3bjrAIAdUdYhxhfdCHCphsQf/FJlxb8UFOUa8SeRNr5eL7s8znLnrC5pKPpWGbUNSlrhLJZHIeXfwbOamae6UVvjto6bMqRe2sxCsMA0dGz+tMiglfmTVInxpEKBkyvF/on/2qwtVw== - - -EMAILADDRESS=pki@sk.ee, C=EE, O=AS Sertifitseerimiskeskus, OU=OCSP, CN=KLASS3-SK OCSP RESPONDER - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/recognisedatnationallevel - 2016-07-01T00:01:00Z - - http://ocsp.sk.ee - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSeals - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP - -KLASS3-SK OCSP RESPONDER (2003) - - - - EMAILADDRESS=pki@sk.ee, CN=KLASS3-SK OCSP RESPONDER, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE - - - zpYj2gwlDYK9ahyGyKa0AkK5ys0= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/recognisedatnationallevel - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP - -OCSP, KLASS3-SK OCSP RESPONDER (2003) - - - - EMAILADDRESS=pki@sk.ee, CN=KLASS3-SK OCSP RESPONDER, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE - - - zpYj2gwlDYK9ahyGyKa0AkK5ys0= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2003-04-01T11:10:51Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - - KLASS3-SK OCSP RESPONDER (2006) - - - -MIIDXTCCAkWgAwIBAgIERCKLGDANBgkqhkiG9w0BAQUFADCBjjEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEhMB8GA1UECxMYU2VydGlmaXRzZWVyaW1pc3RlZW51c2VkMQowCAYDVQQFEwExMRIwEAYDVQQDEwlLTEFTUzMtU0swHhcNMDYwMzIzMTE0ODQwWhcNMDkwMzI3MTE0ODQwWjB9MQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czENMAsGA1UECxMET0NTUDEhMB8GA1UEAxMYS0xBU1MzLVNLIE9DU1AgUkVTUE9OREVSMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKKTI8Aex0Gva9eeeBkM3fGTiNOEvjj2McN3tOJBMAEvG/G7Npu0/2fAEKFFUv4NnPyH3MiC7s6R8PtPMhV5GBG6kWVztL/gQnlIjAbo1l654+jApIQjT3vdVZDIYyS6lKlYoAdG40CgLlVtRihargQ77azlfORkyRfhKZcSQe8tAgMBAAGjVzBVMBMGA1UdJQQMMAoGCCsGAQUFBwMJMB8GA1UdIwQYMBaAFOU/DJ1xPW+8Gb+a9G6/Cf5A652WMB0GA1UdDgQWBBQUQsudE6pYaIJSuWurylGItfy52DANBgkqhkiG9w0BAQUFAAOCAQEAV+Vu+qzrHe7HDjMHq9DdOQTz833QcMRY0huSgphMOgqNjqjPqTNpHPgNvE6HKGdQ0+VWr8IyRWcxnPMZNihmaCGMpFMpYuH0fx9nsjXDbjat8MfGuX2m1EADGOwjtjMuoYTEGEUe3MBeFkmPFDIYpeuS+I4Qv34tOsGvFOpsDkobSATq4EFw/5hI9WfWaEMYkmBXdeokoVjbNpt+gtdGKNBU42AlxLrcc+YzAE1hj5qH99/hl0X6r63pTjUb1ZMRjGQg7ELwmddms7wB5LKKi5kbfmag5hBtDKGs2s0xW1be4ylNOrT9lqUYuPn9lwcHNg1IS42mYVChV97Tlt/5vw== - - -EMAILADDRESS=pki@sk.ee, C=EE, O=AS Sertifitseerimiskeskus, OU=OCSP,CN=KLASS3-SK OCSP RESPONDER - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:01:00Z - - http://ocsp.sk.ee - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSeals - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - -KLASS3-SK OCSP RESPONDER (2006) - - - - EMAILADDRESS=pki@sk.ee, CN=KLASS3-SK OCSP RESPONDER, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE - - - FELLnROqWGiCUrlrq8pRiLX8udg= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP/QC - -OCSP, KLASS3-SK OCSP RESPONDER (2006) - - - - EMAILADDRESS=pki@sk.ee, CN=KLASS3-SK OCSP RESPONDER, OU=OCSP, O=AS Sertifitseerimiskeskus, C=EE - - - FELLnROqWGiCUrlrq8pRiLX8udg= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2006-03-23T12:48:40Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP - - SK Proxy OCSP Responder 2008 - - - -MIIEgTCCA2mgAwIBAgIESQbcTzANBgkqhkiG9w0BAQUFADCBjjEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEhMB8GA1UECxMYU2VydGlmaXRzZWVyaW1pc3RlZW51c2VkMQowCAYDVQQFEwExMRIwEAYDVQQDEwlLTEFTUzMtU0swHhcNMDgxMDI4MDkzMzAzWhcNMTExMTAyMDgzMzAzWjCBlTELMAkGA1UEBhMCRUUxIjAgBgNVBAoTGUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMxITAfBgNVBAsTGFNlcnRpZml0c2VlcmltaXN0ZWVudXNlZDElMCMGA1UEAxMcU0sgUHJveHkgT0NTUCBSZXNwb25kZXIgMjAwODEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnquvUBkU+6dYowkCx7vTDH1S1znuqBusl2TyKI6txQ3YUCk1qXbAWdEjD2uwXy70o+7eDjtlK4opiSl1VW6lPC3qAr5utBzN9BKE7fE4KPty5tyXn7qMM9dKHjvOZrXSGHi0nlUQI6IIMGEhF8D9Ql8xiPoFiASEW5FDEQGAAXnLIQlfVfxJyj8ZByFrgSvlLISEe9e7+++DQ5V8tGof/uAYEFEs8w6wMiaZd/4LRRgqzvLAUF/4zRWdYf27SnsTxfMDyzebaK9N1T8lghTlnLs0V5X00mBnDeJosI7V1tXaAEhamAa+qXBDdygocyze0wFPbn5ZaYpUywcWLbnjKwIDAQABo4HdMIHaMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDCTBoBgNVHSAEYTBfMF0GCisGAQQBzh8EAQIwTzAlBggrBgEFBQcCAjAZGhdTSyB0aW1lIHN0YW1waW5nIHBvbGljeTAmBggrBgEFBQcCARYaaHR0cDovL3d3dy5zay5lZS9hamF0ZW1wZWwwHwYDVR0jBBgwFoAU5T8MnXE9b7wZv5r0br8J/kDrnZYwHQYDVR0OBBYEFCRXW4FmpJ/GGw3/AXu5czpgogbJMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADggEBALnuqrbcM13+ISq6lzIbwaHr6Om2zAialZcAAU0i++lqs1lLTSA/cXoRuUIcjJ54Csh9pVPt3tJ76193H57ICkeKE+YhpHKFTdD3tPtgAU0prOlwiVq7Gh5MR+sMNX2TKaWTj0qd8Vgeui4MB5uWSUWYCNlKnmgoZbV+Zt0AyBHQVG9oRbqcEfK1iPUJw/sjkDUdghUHNUTcXpXfIPWCEvhQz+BX3TRNkR4NREvAwT/tHVtweJi+mr7RPrbtvdYBjdTppFwZVZDpGC34AM6KtL+mpVeGkK73h5V/pDvQ1rmLQn2L2GJe6n9ztghE/BB5zYJ1hWACaoJh5lEm+6xNPyU= - - -EMAILADDRESS=pki@sk.ee, C=EE, O=AS Sertifitseerimiskeskus, OU=Sertifitseerimisteenused, CN=SK Proxy OCSP Responder 2008 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/recognisedatnationallevel - 2016-07-01T00:00:00Z - - http://ocsp.sk.ee - - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/Certstatus/OCSP - -OCSP, SK Proxy OCSP Responder 2008 - - - - EMAILADDRESS=pki@sk.ee, CN=SK Proxy OCSP Responder 2008, OU=Sertifitseerimisteenused, O=AS Sertifitseerimiskeskus, C=EE - - - JFdbgWakn8YbDf8Be7lzOmCiBsk= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2008-10-28T10:33:03Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - SK Time-Stamping Authority for qualified electronic time stamps - - - -MIIEDTCCAvWgAwIBAgIQJK/s6xJo0AJUF/eG7W8BWTANBgkqhkiG9w0BAQsFADB1MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMB4XDTE0MDkxNjA4NDAzOFoXDTE5MDkxNjA4NDAzOFowYzELMAkGA1UEBhMCRUUxIjAgBgNVBAoMGUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMxDDAKBgNVBAsMA1RTQTEiMCAGA1UEAwwZU0sgVElNRVNUQU1QSU5HIEFVVEhPUklUWTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJPa/dQKemSKCNSwlMUp9YKQY6zQOfs9vgUnbzTRHCRBRdsabZYknxTI4DqQ5+JPqw8MTkDvb6nfDZGd15t4oY4tHXXoCfRrbMjJ9+DV+M7bd+vrBI8vi7DBCM59/VAjxBAuZ9P7Tsg8o8BrVqqB9c0ezlSCtFg8X0x2ET3ZBtZ49UARh/XP07I7eRk/DtSLYauxJDPzXVEZmSJCIybclox93u8F5/o8GySbD5GYMhffOJgXmul/Vz7eR0d5SxCMvJIRrP7WfiJYaUjLYqL2wjFQe/nUltcGCn2KtqGCyH7vl+Xzefea6Xjc8ebTgan2FJ0UH0mHv98lWADKuTI2fXcCAwEAAaOBqjCBpzAOBgNVHQ8BAf8EBAMCBsAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwHQYDVR0OBBYEFLGwvffmoGkWbCDlUftc9DBic1cnMB8GA1UdIwQYMBaAFBLyWj7qVhy/zQas8fElyalL1BSZMD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6Ly93d3cuc2suZWUvcmVwb3NpdG9yeS9jcmxzL2VlY2NyY2EuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQCopcU932wVPD6eed+sDBht4zt+kMPPFXv1pIX0RgbizaKvHWU4oHpRH8zcgo/gpotRLlLhZbHtu94pLFN6enpiyHNwevkmUyvrBWylONR1Yhwb4dLS8pBGGFR6eRdhGzoKAUF4B4dIoXOj4p26q1yYULF5ZkZHxhQFNi5uxak9tgCFlGtzXumjL5jBmtWeDTGE4YSa34pzDXjz8VAjPJ9sVuOmK2E0gyWxUTLXF9YevrWzRLzVFqw+qewBV2I4of/6miZOOT2wlA/meL7zr3hnfo7KSJQmMNUjZ6lh6RBIVvYI0t+A/fpTKiZfviz/Xn2e4PC6i57wmH5EgOOav0UK - - -C=EE, O=AS Sertifitseerimiskeskus, OU=TSA, CN=SK TIMESTAMPING AUTHORITY - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-07-01T00:01:00Z - - http://tsa.sk.ee - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -SK TIMESTAMPING AUTHORITY - - - - CN=SK TIMESTAMPING AUTHORITY, OU=TSA, O=AS Sertifitseerimiskeskus, C=EE - - - sbC99+agaRZsIOVR+1z0MGJzVyc= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -SK TIMESTAMPING AUTHORITY - - - - CN=SK TIMESTAMPING AUTHORITY, OU=TSA, O=AS Sertifitseerimiskeskus, C=EE - - - sbC99+agaRZsIOVR+1z0MGJzVyc= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2014-09-16T08:40:38Z - - - - - - - - - GuardTime AS - - - VATEE-101114112 - GuardTime AS - Guardtime - - - - - Tammsaare tee 60 - Tallinn - 11316 - EE - - - - mailto:info@guardtime.com - http://www.guardtime.com - - - - https://www.guardtime.com/policies/ - https://sr.riik.ee/sites/default/files/guardtime/doc/GuardTime_Timestamping_Policy_200803.pdf - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - TSA0 - - - -MIICwDCCAagCAQEwDQYJKoZIhvcNAQELBQAwJjENMAsGA1UEAxMEVFNBMDEVMBMGA1UEChMMR3VhcmRUaW1lIEFTMB4XDTExMDQyOTA5MTUxNVoXDTEyMDUyOTA5MTUxNVowJjENMAsGA1UEAxMEVFNBMDEVMBMGA1UEChMMR3VhcmRUaW1lIEFTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2WKqpwAceqQ1DNnsIvmj7AsSFgFR4g0U3ot8aLmIVT3cJ0rVN8PaQ4zuCIGf0xTM6mp1nQRqvtEScYkijZ9lSW44KDs4P71rC/8MYuX0NL/AwDlevmjCEkvHvqCQw7SAJ5gFkObc6FGjMcOzzVDTLc/0g9txSaFy6A2kTQYWY2a7DhqRDVBJphGhW8ir28DmH+AGRxj5I3vs6V8W/x1xy90yWunh8b/DNbS+29YKQ04phwPl0Ks59qvsgm1wPppix0xf/mp9HGC574q0zq2Ee7v4PAhu2FwY2t6Hj887KTWeVDUaRsVtwKqqDWJdmJBG/Pa96H/k9v1t5Lln8NlxHQIDAMm9MA0GCSqGSIb3DQEBCwUAA4IBAQBit30I5IzoldRcKYbWRLPrii5nNcmdLFfOVbjjfh/BcQV4G9cIaNtimuaw75Kq0eVuMaD1GBzn3gNSA7UFpCURt5xtEt/TNdO4ht+SLkVuFeW7AgRSlsJ/M1LiNrQei7qkPRTYrJwT4TGFbycy6oQVkHsFx0WSntG1TECDxNfutS4oKJQVp9pCwt99CVpt2M1sniIRFIsCgeYgwP6EqB0fwHpAZGZeX42VMmvLUFdkuijBgW8phGP5yxDWGWHkY/l+XDTZB2SlBbYcgDpQuS1k0lhGRZScIDSUr4g2ig1LBrbPlMakNXg/EWh74KkDeDDE8NSZFnh/cr2azvcXqt1G - - -O=GuardTime AS, CN=TSA0 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -TSA0 - - - - O=GuardTime AS, CN=TSA0 - - - FYIbyUnpkQO13KX4X2hiUVTAjj8= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2011-04-29T12:15:15Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - TSA1 - - - -MIICwDCCAagCAQEwDQYJKoZIhvcNAQELBQAwJjENMAsGA1UEAxMEVFNBMTEVMBMGA1UEChMMR3VhcmRUaW1lIEFTMB4XDTExMDQyOTExMDMzOFoXDTEyMDUyOTExMDMzOFowJjENMAsGA1UEAxMEVFNBMTEVMBMGA1UEChMMR3VhcmRUaW1lIEFTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3IeYUjkf9LPKTkMUrjeOofT57NjJd+5WUmrsTRDGJsW6CWN/rM405B4EbXdrxeKR5TXqvTc8uKB8vb7QdQTBYAEiy8y49jL0wApQ40B2wnAj7kpyeWHwvMLwqeVyAxFxcR+gytsUxdRXl601g7GvwlXpCqi8Alj4vKykx99SBgsrya0CnR63v+Rgwv+0tc3A24b5SiE395Dzh1R9N1pgXWYNOPqn98A1cYWGA0bwayHzpcqw+e4YcR6qQ1gykULsPNlnIGCkakiOshblezzB1WrSziT6lNAjNSev+M7Uo4j6bCB3sFRrv1NXJWM7AqLxn+zC1xVqihB+N9m0YmNkjQIDAPHnMA0GCSqGSIb3DQEBCwUAA4IBAQDUXshmA1Kx+fPyMrbQkOim5FrSoTuLw4Jaxhhcw5wQLTnI0H25IwciqGisi7ou4fYffaQISbLfbXEpGG2aaZ9DPGGeG//5NPvtLoxLYw3igmaCYi4QEQ+O8Q5bH/YgxJWIZha8qtDXYjBVq7giX+1Kkb4O87BcBm9yGWXnDbu/Cbjvv+lnbhLff3N9AGlhEVZW4y/WNgd4RjRANYuKHLsNdBBT2jnxTirGzHRbcQ3QwxJUcTO+z8f/WUJfq6b/VayReUnWrrmYG6btzU2iwUUusb+eZ2uvNNAjuIJS+ngc8g9FLlty5ZcTR+SadzU1H36mdCE1uGHVDl3L07SlHNja - - -O=GuardTime AS, CN=TSA1 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -TSA1 - - - - O=GuardTime AS, CN=TSA1 - - - 45sv4BLKD1el+RtP/81SVdyGgmc= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2011-04-29T14:03:38Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - TSA1 - - - -MIICwDCCAagCAQEwDQYJKoZIhvcNAQELBQAwJjENMAsGA1UEAxMEVFNBMTEVMBMGA1UEChMMR3VhcmRUaW1lIEFTMB4XDTEwMDQwOTA5MzMzNFoXDTExMDUwOTA5MzMzNFowJjENMAsGA1UEAxMEVFNBMTEVMBMGA1UEChMMR3VhcmRUaW1lIEFTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx77CtLsrKHF3SswUv5uBEilPF3hJS6J+W54dKIFj4fE0xkxl7J7yMlDMf3Gk2tunTpZolsOKDPCbsl/9SsV8dY7y+yCT7bRT467yfi2zqTrFybHjXduYGSlvagNpYVw260he6gVH27D/IdpQv2eWOOScGAWcBOZTr6pZxEuX7b24luq7sSci8hv4ARpJamWBTLQX6sdxfiPhjnyMIacEGOQuEQgUjPKxAxo45ApwSHWESD7lAm2PQNacSZJg8+pkxrOq0s/7FrsgfJzQxlDhyF9BA7u28ilsCL60WdVbxqshmQBp91yyuX3ZHAkJ8Wp0kT8EwVfVnLutFWxzXp/4gwIDAOHjMA0GCSqGSIb3DQEBCwUAA4IBAQAAYwPUlEPIzB88xdz9WTaC8/QNF/DbfYOYKOD5439rGPhWjJ0YBe6SliohQf3lK0tfBrnaCj+Nw8EwzJ7fUD6+9xJ4FLSSQPSsH3pxZliAdiLXKWXUNou6jiPTh9gSDBkkjHvWCMhHj7GNDdIEABbwfqsSlejzNsQZGUVu9Z7vP0+flTGvqC3qIJqschhpQWZqaD4YR73K06H+JEFn6vnGQ6UVsWM/KDaktvLStQui/OwIqK8kyEm2cpCQOdkVPJZ7vTcGDgonWvbwaxf78xPJUqHSNkuWIHveV6dFlS949v1eJYEwvcsv6DyVD6UI8A2efjnQmjA4KbXucmWzm0KY - - -O=GuardTime AS, CN=TSA1 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -TSA1 - - - - O=GuardTime AS, CN=TSA1 - - - nsIInN9NggJuait7/oodYeuYG8E= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2010-04-09T12:33:34Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - TSA2 - - - -MIICwDCCAagCAQEwDQYJKoZIhvcNAQELBQAwJjENMAsGA1UEAxMEVFNBMjEVMBMGA1UEChMMR3VhcmRUaW1lIEFTMB4XDTEwMDQxMjA3NTIyOVoXDTExMDUxMjA3NTIyOVowJjENMAsGA1UEAxMEVFNBMjEVMBMGA1UEChMMR3VhcmRUaW1lIEFTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp430lCKJvdyzzdK95iX4IlSE3MyVDkiPcQWKdvM/O0K/skXMKxK9308G01VVPz4Q0Fe/zm9Hd/b0tF6lNehGpi+CUfS13eq32JZvfyI7UsGNZCiU0nnkuGUUfLCXqlEMVsqfxXu9RAhwaJE3Zw0GZLc4jSF9xJy1HRSSryUkgp09pOl/PP5l0IgBeUESM0U3ALPvS5xjgMpYJAOshZCIS+rsyO1Cp83ymVNyGAw2jUCgjHGHu/l+wbTw8b6C2pUnqcUacaemjctKhtf6hNs+5+uTPBW2q9oA8k2c0SQii7+V04H8L8rvSdLaeVuNDgjEjzqPIJV7oS62APrWlWOf3wIDAKlzMA0GCSqGSIb3DQEBCwUAA4IBAQCCHTCmS6YOLlnhSEMpOq6F6ZUPq7B4BIEVJPlZOkrPuGRnwXY3CP1CM01mM2FcNc7OMYwEVyJNt11Aj12kB2yoCGCqABdYij78P2n4MzQykakymH/IQhTiP6rZ1glB1stye5yboAvezm5Cor9IbdGSf9QEv7DPGYqqyEwDAqCIhIgyKWBDTixcKkRFlP7hvDWCzYaDaCzaxcxN0Cjv0KTMoTDzK97IZJ2+qrBcgP/9AEsZIfPOlvzObbrRpnmwowwgNvYT3p3il7irrIwHryQh8H1kU4AwxmHtuMDcVKvQQrxpCQuEITPlBlelY2MdXKRoCcu4q//X5lq9YYP1XIjH - - -O=GuardTime AS, CN=TSA2 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -TSA2 - - - - O=GuardTime AS, CN=TSA2 - - - aj+TWPM7OpTB+vFnEQk4DETK8Hk= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2010-04-12T10:52:29Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - TSA1 - - - -MIICwDCCAagCAQEwDQYJKoZIhvcNAQELBQAwJjENMAsGA1UEAxMEVFNBMTEVMBMGA1UEChMMR3VhcmRUaW1lIEFTMB4XDTEyMDUwMzA4NDEwM1oXDTEzMDYwMzA4NDEwM1owJjENMAsGA1UEAxMEVFNBMTEVMBMGA1UEChMMR3VhcmRUaW1lIEFTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0AjnC81sjs87Vv9e8XDGWcKaj7kJTxuaeWpC+WULglfyU2YSawqwb1PZbM9AT0Oi4Dz44tCG1o0Kcaeik+vWFe7AU3GSSC9K4Y3+jrhKZEOhySn1yI1DMdnl+Iv844R/IqS+XEKvP0c2LLnT0Bnmz6l8GIUh2c9MJWXIXfNyfgymldyT3ssw/RabL/IksTdqMsa9B7ar81vtmEG2rzsUjCl6I8U6N7Etv3hseALX/mcdWplpWn8uxAGUl8KqskF1itQ04BOU3P6Qk0WsLFBNCeQ2Rj+HcHPEdxtkT1eM0IbmOT71FuS7YZjC5fqza+CoiSPKBMJioU+28KG1qOFC1QIDAOwjMA0GCSqGSIb3DQEBCwUAA4IBAQBftgbUf5jzWS5EwcLmi7OgQ4ejPme6ZO5M+SX4OJh8cTViXOpqrF6JmIaFl7auqTKa4KNtgWmeGzjaqD3U9WamJ2aU3xmtf+t9rHWns9dBE+JRVdwNIjvOyEt+foSCENaFxtPRDqpaphx/fYC+jdCdNh+JHuKxqf1tW9ktBFNxG7qxmSeBa4eC+RosAXtt0gbmHBVMOQJOApGKIlQzruJ3c5YrCRzza/+D9jSkyp196VO+aYmt2epLMTK5CvJlgIjvF/vyuJuEXAnqd1Si6qUbfLxchWHgJ/dxUf7DxeqpPzJ8s+V0CD0fXYTIHa3p9Kz7/gLqpZMcuY8OH0nVnYOn - - -O=GuardTime AS, CN=TSA1 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -TSA1 - - - - O=GuardTime AS, CN=TSA1 - - - QdnoWaDRXvOdBJZ4GSjbfUW5bjs= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2012-05-28T07:45:00Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - TSA2 - - - -MIICwDCCAagCAQEwDQYJKoZIhvcNAQELBQAwJjENMAsGA1UEAxMEVFNBMjEVMBMGA1UEChMMR3VhcmRUaW1lIEFTMB4XDTEyMDUwMjEyMTM1M1oXDTEzMDYwMjEyMTM1M1owJjENMAsGA1UEAxMEVFNBMjEVMBMGA1UEChMMR3VhcmRUaW1lIEFTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWgbOYOThEhCRi61lnP3GSdD+V4sjuQCehCt9MJ+yyFvrEcJewvGhMaCBq7mUJul0yV5pCNoSH7gLDaO8XByJ4acmV8DxKAH1KlLSH/tashAjxQLMbReolA9c/qKiwO1oK12z5OCN7rA9C7PBO8gk/sCLFacOwgYtDCz7faY5l94AEaniIA62hT3PZ7Sd0IkcL5Gp9goJ2tZdQ+G58GBZawF+pfS2dzWSkKxWiV/lMzZahRdaXUF7vCGsXDsVHqS3AhL7ZblGCRVX0Thg+RCyRBqE12iPea8HWcVMxSJFHLhvSvKHTpj3iA6WVIOCJGUlhcz7h373WCKtgwGx7U+tQIDAMRFMA0GCSqGSIb3DQEBCwUAA4IBAQC4F/SnPubK6gaCyw5/7+sMTMILecuEGZ3W3ScAWLY4KP04pS7ViqlJxCvH3brl52dc9gUG0h602hRlEhdcXpk96tcd108er0mv666mGp97CT92vIL2E46mnz6QUG8uWyNfs+7K5SCgfkAflU7+lypM0NjOLXfDgCDRK2x3S7EAJh1mlqYSRHL9mst1sBLxjUMzi2xzOEGh5SaijIb0xelm2bp2J3JZrCvyjvGGA+95xRwHrGL9sMFdksrY6u66gG9zea8qurkSzRYBv0OGNUHwQWpw95QPZ47IITq9ipqC+J67FIEZheHTUtgPfvx1ch19IS8GiSM72M6rAeS8Kq19 - - -O=GuardTime AS, CN=TSA2 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -TSA2 - - - - O=GuardTime AS, CN=TSA2 - - - wDEee81dyoI53eLTZ4ElUd6o/QE= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2012-05-28T07:45:00Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - TSA1 - - - -MIICwDCCAagCAQEwDQYJKoZIhvcNAQELBQAwJjENMAsGA1UEAxMEVFNBMTEVMBMGA1UEChMMR3VhcmRUaW1lIEFTMB4XDTEyMTAxOTE3MzE0M1oXDTEzMTAxOTE3MzE0M1owJjENMAsGA1UEAxMEVFNBMTEVMBMGA1UEChMMR3VhcmRUaW1lIEFTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+OA6jsb8QE/mLd3RPZFW40+l9RiGhpVWtaPSNgJAu1emrld4SFmLpOWM5BPsK6tVj2waLNucmEuRtG3r6H91E7EEgjsiBDxJaaREHytXMgpatMkt26X6Cg73Eb0pvD+5eBIh6VpksIWHtRrtq6ahde2wpb9CUmF8nb9IjfJqEsd3L9+EfsF4/EppRzOs4GDzKG+NGmBz95IEMGiIf0yh9Ot05b0Wj4xdOT7sJONbF0lC5qpQiPoXMKeLzsWWj6RfctjjhJZ9s2xEyLfwM89Yb4/vdwVVaa9Rk36ZkCvuoJeP1e+FKDXAJmNRGp2knEC1lQBZvXLG027bKmDdU0+WGwIDAKKPMA0GCSqGSIb3DQEBCwUAA4IBAQCR63M7Z45TV0MW2eA1bYO1vmRSryLbBK7fC4+2T8BqCXC8PYVxRtdMrQMdLUvXolibDY8bUDIC3GI4LLMDu1ivVcAcRJOCO4ii5KHxmK+mlmInif8v7YTZIlXAqPxbxJlYmpRNaEHFcDS7fciYzvohPzpbxRCKb4Nu9rfA0YqJv2s0vZmkZPTQ7W1vwHQw/+7KeRL3v/oY6/ANP0eKcNURwdhV3es2kya3RyEXH6sJuv3iUGOIPTAp5h8T7RV0xjlDxnz6BcRMSxxpFhyaUJHaA8ELKQXqHx1jjz0Ycri/AdIM21F3wc5Uq6855rm1STGythhxYFkrgx/dgLU7JeXc - - -O=GuardTime AS, CN=TSA1 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -TSA1 - - - - O=GuardTime AS, CN=TSA1 - - - u4+kp6DnUM0luSdwJVgTsm7g84Y= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2012-10-19T16:31:00Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - TSA2 - - - -MIICwDCCAagCAQEwDQYJKoZIhvcNAQEFBQAwJjENMAsGA1UEAxMEVFNBMjEVMBMGA1UEChMMR3VhcmRUaW1lIEFTMB4XDTEzMDUxNTEyNDA1MVoXDTE0MDUxNTEyNDA1MVowJjENMAsGA1UEAxMEVFNBMjEVMBMGA1UEChMMR3VhcmRUaW1lIEFTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmbkBqCyj5DTDvCRFqy9AubKiWtz1NczYGFG4Uu1YrtNpY7hOrutp2SxjBZGMwcXDXdzIceE28FCvuPjhTF1MsSmWA3wRqEFfdoKtwJ3hYM4N8NKB8GHgDKRYKw5nY++1anjt+KoxhpZsRbaAvPZSkbONr6trgSe9DUXE1WJ632LAvC0PGdd4LnUERxnernnhs5N/mQwv4BJmMPHcZ2lpiMfBCgJ2/v7r9UbodVRkGr/EHMzp9RdehneT3IQpMDV+7oL1niOyXi6KVdlbqaLzmL8QTpQuopfhaA6uKaAegWkkEaYOo50BK3xYKZjCUHwL+yH6Sw7ddgGNtBId7vtdpwIDALyRMA0GCSqGSIb3DQEBBQUAA4IBAQAjlFih75+4WvKgcTr7CHVgftiGLaSCa93uq57kmebap1raFqigOkCYpqg3Jx5DDhdGcx93VjdqTt6qC8IAvx2VJAywQXOisTtIrfiXK5hXUJMWlXzqT6q6Kv1q3Ac8603QySfStmVg5vehW504bg2UnjjL2oY0+X9e/D8nQRpeI8zVNAYYk2elAr3nNDrcR/kRtEfughvlK2F4fS5R4UrNO2P7xTaiNdQwRuq3CJZEkA2HjPRXE3kiJoL80p7aWU6DKOOHZr6VQjcOHJiK5T/ZUHeOT10tM3BCPHzmmHAs1ziMkFFfItOmAXooOXBsw8L3cOX5BiopaTnMzMw7Pwfo - - -O=GuardTime AS, CN=TSA2 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -TSA2 - - - - O=GuardTime AS, CN=TSA2 - - - D3QyCl0LQEFZ0QcjGfxJDWFGZyY= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2013-05-15T11:40:51Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - H1 - - - -MIICtjCCAZ4CAQEwDQYJKoZIhvcNAQELBQAwITELMAkGA1UEAxMCSDExEjAQBgNVBAoTCUd1YXJkdGltZTAeFw0xMjExMjYxMjI1MDhaFw0xNDEyMjYxMjI1MDhaMCExCzAJBgNVBAMTAkgxMRIwEAYDVQQKEwlHdWFyZHRpbWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6jdPpv5oA0BNHcFTVZpB8CEjGZvWix4KWgbAVbJiQaiLx2TgmRrimtAi7ogQ2qWPpJJbxgnKQUvpL/913tMH1blL2PXYk2fR6xU/jF3DoBvQBA7TrX39OlcTn+GO/noh9/hz3/a5ebyp452AyFow/g7IzvECf/kT8G+OcIj4aWK/M7qbmrj98eB/j6t5kuBF26llyLzExJr4iJOTSuCaR7BT3yWuLC3rAUtXJaG0XiQxkmTd6Ibt5GK8pSBtsQfKeJv9iTUS6I093rqZ8dSiP9/k2satrk9/hy464niGyXiKWfiEwWBeEe6okg7FwtZZ7ZHL42IATqLBRmbI9qvbXAgMBc7MwDQYJKoZIhvcNAQELBQADggEBAEbHvn6BZArTuTDE+opwN0NZ6FdtQ102tR1qWMcNGgKKICc1dvQpTCsUD5X4RL26pE0aNy9lB6HFa2vNlS4ZOz7LAbxKWn9DwSTHZVCBmDz7cThAop6YaVd+f2cYk6aP4FnIWr0dfSTTqxIWyFURip5TLC4vgu2FvJRuQU3LTBcpdbi5WwVSxxgS5VCzpEc5qUC7kZFGBV/aze6CAxUoE2nWrK3udj/8RUOSpUyaeF+f4oEAkR/xMKvd1xuWjl09rRyOD71h7WhfmNAJDHYZVRVthl6XBJbv+DMOkjpltfeFUHyvZm9eXEZnUh+KS8VpJ4O62VA+rNwV6e2QgaaVu7M= - - -O=Guardtime, CN=H1 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -H1 - - - - O=Guardtime, CN=H1 - - - zQ97Xa7ocnzmMZDaA9ZAuQVArp0= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2012-11-26T12:25:08Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - H2 - - - -MIICtjCCAZ4CAQEwDQYJKoZIhvcNAQELBQAwITELMAkGA1UEAxMCSDIxEjAQBgNVBAoTCUd1YXJkdGltZTAeFw0xMjExMjYxMjQwNDZaFw0xNDEyMjYxMjQwNDZaMCExCzAJBgNVBAMTAkgyMRIwEAYDVQQKEwlHdWFyZHRpbWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGUFzXDI8KWQj8/UcZLf1BecHHG3+YYoA3FwfZfdNjlbRepRdwypQx8p0RNbvcZC5eP7TnOLz8tCA95jBclLXOOMEKLeIdbcEuERrVNNZ6MplCsLBfxf0rSZzPcgjUA8vnREZj+rLqYkUwt6P2qt3uwCT/Ymm6D25UG373TX/058+7+8YlftspEowUPZt1E23ZzpTrObervZSiqvy4V1+efOPQZq0B/h71hkmw0+/zuWJ9vjTUhS3sde86AqDf8s3q6G1FbVEH9ilnJ8XZipam95fZx+kRCeBQ/Yitw+lYeLcGFQKOJ0uZuqMo3HnFcJfNkd27uA1Ymi938SVOCypfAgMBbiswDQYJKoZIhvcNAQELBQADggEBAHR1TVGVIuBLeTtrflzXP4bnsczEudLu36D0dTKcwTvBeGB4YEnaBp69vKT2/boNbdeZ0Pm6ft7PQYRzQg5v8NVlqmYwq8pAxNhrywGOICOynoW7mnRbooDKVQ25Ct4vdJwdf/pcrJ0l9F1WX3MZ5rNgKTPW6sXrMReXojfFf/2YwAvdwPhATjtRvnXYhkkN0aeXvkgPiPMctEP0lEiZelwWm+DjVFHOy8l1d4+38rvh25tuChxxcl/p45/H7xpAndHO1qpKEu9DJy6q5eWBcNgvHVf7UTXSDtIuRCOcS6g0Q2yz72sdW1Z/m1W/67ToYjofQwvhc14CrhQkD05pRAA= - - -O=Guardtime, CN=H2 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -H2 - - - - O=Guardtime, CN=H2 - - - 4wZ8Qgdniap0mVcJ7mqsZKvwOjA= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2012-11-26T12:40:46Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - H3 - - - -MIICtjCCAZ4CAQEwDQYJKoZIhvcNAQELBQAwITELMAkGA1UEAxMCSDMxEjAQBgNVBAoTCUd1YXJkdGltZTAeFw0xMjExMjYxMzAwMTZaFw0xNDEyMjYxMzAwMTZaMCExCzAJBgNVBAMTAkgzMRIwEAYDVQQKEwlHdWFyZHRpbWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVkmSzH2Au23FOAGkCMTdCZUoHCcOHV7EPqVxFmwea01gS0nDfAjzFUcudvgYRtaw6r6r4ZPLC+pqBI0W7FjeVpRQAuKypYGhie2IEd2FAQLDB4gnJl68Z7K9B+Njc8rvwKbrqix+N3ReqFz9IENbwtGrXj90SMFBoCofkmUCe+fy5H/YYjhud7wnZUhYPw7DsYU+5eqAh9dNXNSD4gxOLDoZgID49G953fS2pkgdZKIWpZl+/hftiTDLD92NB0HYwoqEJZZGSM+RUKMxPeRiHz6goGcqoXp/WjeXyd5uiP4TQX8KsvAQQDTBrBs8DFbFlL7MOEzM+vvV2PdFdU0bRAgMBDskwDQYJKoZIhvcNAQELBQADggEBAL/Invma9hUUj7tcZAKKNlZm2bktd6jguW+eFUbf7m1zfSLw3sq85mwFkl8hSDlV/d4pasJJCd8KmGLki5T9BM/TAjvzf1g2orBGMArhZkYNnYkuJTHcxetLFqtyBxdMKGiObmhfTI1YNAckomnvsausJ8ejsKKFxFTcWQ1TOeL3v3N/sZ/c/pwVd80ZbTIo/k/dFwbRVkhuj3Q+DDi/8tlcGXSAppBVX+uFqDGudu3TZ8XQY7VX7ZSH/2rIO5SZm0CbgAOFYQitDLKLIXEBS6R4W4n559L+dXIaStAR3U8Jmx8WXWMSsa1FJVynyiVLUMMw07mVgQGUs2IK81ghXsY= - - -O=Guardtime, CN=H3 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -H3 - - - - O=Guardtime, CN=H3 - - - d8R/lqslVchhyESZTyjfFalKaYM= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2012-11-26T13:00:16Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - H4 - - - -MIICtjCCAZ4CAQEwDQYJKoZIhvcNAQELBQAwITELMAkGA1UEAxMCSDQxEjAQBgNVBAoTCUd1YXJkdGltZTAeFw0xMjExMjYxMzA3NDdaFw0xNDEyMjYxMzA3NDdaMCExCzAJBgNVBAMTAkg0MRIwEAYDVQQKEwlHdWFyZHRpbWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNVtvh71sZgFYcsv6a/zRU3/iby6KWNztiEjzuLl2oaqsUEVHq4kpAAj6/Hl+UPpIEwPEckB6rpGRgeN/+K+4bWJTrxh/7S/k3sQiHozTAYIOf6TIC4xAK5rjkfRyJNWZMbKU5ShXGC+DMh5sn5ZLtxOLshP4bVjCDrKUb+bNJCxYE/UT4N3bSPj3j45CgYnwqANWu2MFYcuuwSI6M+BiLWRA9HNLwHF3nVibCCJtyo17gN4oa236h61/+hehqICa9xePBBRh9gao35dtFNOEUgEN+qjqXGkUBrcFst6SG0nGh67AGJcQeku3QKU8Z81qocY9NhUKeXordC1C/XPsfAgMBWGEwDQYJKoZIhvcNAQELBQADggEBAGAdaaN8Zy/BWVBH+hLT+LXFJLKmFxaqRKRiyPtuerCRHmKjlHw8JqlVjB1UDUy4BN1LL04k6iwcpZX/ahuvlG0cwrdfi2/ld++ngyMQ8ecFEvjvli5u9kqiWSFxwDtA7fU5rsTm+Qni5hklPA60VMQHkuylx5oHejoyvPoBEft/tQnQ3QL+re7Cs06in8hkBtWndYK9jyot7G99wWfR5TEYzYQkze1L0oTjmySW/+EkrsT66XmRWHQuYLgo5tL5D+oO6H2tfeiKQ5PO0+zDLwQJJYjvvITCVKudR7/sH1v6/B4nXuvch82gaAzlfHK3EP6TQ7CBC3cw+uZ7qkggdIY= - - -O=Guardtime, CN=H4 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -H4 - - - - O=Guardtime, CN=H4 - - - g4Rp4hbka/wb/X12o1eSDeWB078= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2012-11-26T13:07:47Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - H5 - - - -MIICtjCCAZ4CAQEwDQYJKoZIhvcNAQELBQAwITELMAkGA1UEAxMCSDUxEjAQBgNVBAoTCUd1YXJkdGltZTAeFw0xMjExMjYxMjUzMjJaFw0xNDEyMjYxMjUzMjJaMCExCzAJBgNVBAMTAkg1MRIwEAYDVQQKEwlHdWFyZHRpbWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzNmmpHjZG/rb8xYUBH5TgSkSE9tkVl+JgtkeokY0BLZvrJhM9TZ/XX3AbN5aagJWnMgxPDBCyTYcA7XzsW6lRlQK7gym+zbLi9bmLEcpQzEYdeQs4Bi39Hb4vtlHYOFQjdck5H0CCaiLoJVJxX4b5y1dczJjXN5n7pkBl/YXXuIt4h/41bdZKw25j/KxEGWU/CmlZdrrDPzYW85aYk++dbO+uKspRkkIQZV+impSUpbwjOoN0VjfrmbJ7s+iyvB94j6qvvSTl537uFY6TOK//W3O4OrtEd8ze3aiePC517yTM8IQaUOrNy/pojan7FkhvLcVi1duQILuAcDu7gaQjAgMBMMcwDQYJKoZIhvcNAQELBQADggEBADndrk/PCTqGVmbrtjFWmYIjLyFgbUihSoHHf2+kw66Mzi77LFkDc+CYSz5M1pIjsXQe+a+Kkrvpc9YKkvxnT81ttiSduRujCNw2ISrYfFVP91Hzxh6hl2mnRSF6LOLsNbZCaSJjkH4JPuFdnY7wUiozKFmt/6T/5qu4B7osH5o+sLuCJKcgk0fXgssx41JM+ZUWf5JhS/QUUaPiW18s4SOZmNmO5w1IYVVG70bUOXsoGsVmrBNuuQeikPPdE30OAf+4ODB82rudUZok/ZrSW69p+eiAbkLKqlVfd1Lx05xeLf/EBgIvlSXRUECHV2LDmTbwJq1wDjHh5NHN7Z8I22I= - - -O=Guardtime, CN=H5 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -H5 - - - - O=Guardtime, CN=H5 - - - 1y2GEphAgI0iKD3RaFtEI/53Aoo= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2012-11-26T12:53:22Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - H1 - - - -MIICtjCCAZ4CAQEwDQYJKoZIhvcNAQELBQAwITELMAkGA1UEAxMCSDExEjAQBgNVBAoTCUd1YXJkdGltZTAeFw0xNDEyMDkwODQ1NDNaFw0xNzAxMDkwODQ1NDNaMCExCzAJBgNVBAMTAkgxMRIwEAYDVQQKEwlHdWFyZHRpbWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDLKt3SYJHx+Y0zQypj433j9k23BtR7VxLy+FDL54GkqmAiCmaknWz/nRy19FM+kDfciM92OySnneN+nOyykfoblJ0uL2CIhN5vYITV9QvHxNNsij0urOiWu5eXui6N6T+lZPOl938EmNeorJbgzG7FeDJid5W4kRBE9apiRBPp3YFehl0crycBgLY6kHlvvoH33AgwsW9Zbp2B7jWU92GdH1D3aBw5JwhEhSI01sqjcI7Odbh7PZaygsXpoVRyW1T5PzDDR1+qoWHoak/oN9J0NXMEAVyswpytQ0rckOIbnXhfA7va2WLQ8+GuIm7wKwquS2wtqgBPbyvO7rP4L/AfAgMB4EEwDQYJKoZIhvcNAQELBQADggEBAI52GHcEe75qB8Sps07G3TVA+XXh+PGFZYSMrH5bsn1uJvaDNDb1fl1dQCK+YibtoxzVM0pdyBVlHFWsex1wTpdmstsmZYP8Xaj9ezabN6nPSCz6pdzhFUKM2XG0kuny6JLAFuNjqsh13SxsATARL6yZv7L2PI5VclXHbcpRhNaqiTeTKxLfXqfTgSX1f1RGNJI/r4SoiTBT+PFJ2TcJfc5GTuRunaTeGVIe+QGIrv0fWXAlZylGTFszgq2e2hh/1i9KFlxD7gS1IPvSRrxHVWdTEjM9BHSjMd/y6L6jQ9Ti9qW+UYz2CRo8sOYgfB7axA1mVmv/W60TQr2pkCl7GDM= - - -O=Guardtime,CN=H1 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -H1 - - - - O=Guardtime, CN=H1 - - - Eh8iaw0jrxBJx9MGEmtlnpGmxyM= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2014-12-09T09:45:43Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - H2 - - - -MIICtjCCAZ4CAQEwDQYJKoZIhvcNAQELBQAwITELMAkGA1UEAxMCSDIxEjAQBgNVBAoTCUd1YXJkdGltZTAeFw0xNDEyMDMxMjIwMDZaFw0xNzAxMDMxMjIwMDZaMCExCzAJBgNVBAMTAkgyMRIwEAYDVQQKEwlHdWFyZHRpbWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC8ojFnaqso7obLfS6sDn8Mj22s/ZcmY2NbwfGy12xX+1FpEjgwrwea8Uq6YS55Mvux/oRcBh2UsgFxnn0IlzSLgrmRx0t42PVuufygcXVGy+voYjxsOJUkP8uFqdv+QhLPUHTyVzMKHIYvVEa434dHKiSK2nwWkpFVqEQ2hITU/uSv3ZAX64F+7iJuIlraefdZ0QC6ucdOsxAFwC3FEH+HfPpV2rb6nhsBu8hxIGWOqDHoCcd3y0H2+7n/BE1pmOCkuT0j1tKU2NwUrEvWfRna2xyx+zNff9PmcNRrlT0yytr4ghCuQJbcGpA7+EGf5jGKfGjL1xL6GXwnb3W23SPDAgMBHWMwDQYJKoZIhvcNAQELBQADggEBALxmxs0QzRhDIlCmedBngmOGYIBd9sJ3TtWXak+4cJemPttrKPetWlDnSHyW2leuO6neIUtvKSXVETrIqbX0Y2bn37qPseBu3284qWLi2fAYhhOKfz2PEuUmck0+p3wKH6iDgsXgjmQuu6wO9m1+Y8qB/K+mSwi8gpxjBU38aPCgQrPZnIAbBPpju2NBb241ep+aOlonKQRO+KcsPMwYzLt0xEmkjopq4dRl0i+Nl/m3EVc1JCIslvSD37tUBQIbEpvv7OrXbv37xvY9Cr4JRWrrjrRO6n1d2NSxdagHjwobdBgPCQXGqroMxUNL0EprVmlbRNvWkxmj4wd6PYKfnaQ= - - -O=Guardtime,CN=H2 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -H2 - - - - O=Guardtime, CN=H2 - - - EYQKyMAHRbdf0QdxvZ2qxd7XipQ= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2014-12-03T13:20:06Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - H3 - - - -MIICtjCCAZ4CAQEwDQYJKoZIhvcNAQELBQAwITELMAkGA1UEAxMCSDMxEjAQBgNVBAoTCUd1YXJkdGltZTAeFw0xNDEyMDQwOTI4MTFaFw0xNzAxMDQwOTI4MTFaMCExCzAJBgNVBAMTAkgzMRIwEAYDVQQKEwlHdWFyZHRpbWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC15sVKLBcJ6NRMFmMZxyBy/kKCcBr8zwozbZ+3cyuKeRk8s2+9IEH0xklpE9MxCmDaW65rpk24aX01A9LvYaM/Jn8bzE9H955wuRTWZbUpW22iljLxjq3x6bM2mwMB/BRkWPK/0BZ8mO1XOXFGh6eRD5OqLXDen3AXno3LgxpibK7jHekfX1aT2G35c2zDcZmif86bQiFSxPxI/xJXiJcswX3Xl1CoEdoyiOhyYIl1756QKzNL/yzXy4W7Fczk5gjax+ke9snndPg/ZnPzKLHJowNyPzobhG0R7W7eG/S7BpxMTEG3alA3BZvV2gmVDw8Bp8t6mNNtxgbWL6fqKQdrAgMBb5cwDQYJKoZIhvcNAQELBQADggEBACyCZSs4DiVR9FvRRUCeXAU4zpvlO2+nlAqL/SnK657aHNbnnQKqtBdoW4N/Gf6Pxz27B7PB1c1p1qgmKzvVewKfwh+37XoCIxqenoLzwALGN0wPne3dVB1Jf8DMEMtECB5ktZMd/BI8fgc6VlYBDnDXa+qu13hbTHYuWV0dIokseNOoNU9twcABn14E0AsEwfalZpXps9LQgjVx609pZwDFRQo3igzY4qKxpivUD0xyrjjsh5UebldLj2K7gtFubrenuQuRerVFIJ82VmNsAdFFzyVsCXdUdULO+wxcnIjCUlAY2l8CEM70z/UXmuCCqnoqPmmXk/oEIdqPLZQqR3c= - - -O=Guardtime,CN=H3 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -H3 - - - - O=Guardtime, CN=H3 - - - QirOC5zp/hiyOrBnqKibCdrnyZ4= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2014-12-04T10:28:11Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - H4 - - - -MIICtjCCAZ4CAQEwDQYJKoZIhvcNAQELBQAwITELMAkGA1UEAxMCSDQxEjAQBgNVBAoTCUd1YXJkdGltZTAeFw0xNDEyMDUwOTQwMzVaFw0xNzAxMDUwOTQwMzVaMCExCzAJBgNVBAMTAkg0MRIwEAYDVQQKEwlHdWFyZHRpbWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgdoH5rbrx9r/CkW7gdHjEGtJlVYP9/sF26W0yMVvyEApwXJk9ccM5FNeJlnHO94DQ4jQIYGU8MnFu0Xs8FlrRI47vPikjsdI/HfGW8zQFvPq/CGR2JWtoTW/OS3TLlhuKsgZ4ynsIZs7VrU9H1bk/OyAgtvK3sbdyELF6JYIy0t2mN5kXHPgFYs3PCifQteLEDsYLdxKKtwnEpR8Vyptw/9iNHPsvnqwpa/U5UL0Q/0dF4fxpYNwVdgTKL5bpjaI6I2NmYBdhI8L9aTdEXsP+kSA/+pB5iqNGZ9vlrfweRLsqb8fIILjgIheJwgOKMMTdfIsxfN8nJPr6ICAjd37DAgMBmHswDQYJKoZIhvcNAQELBQADggEBAHh80N8rHNR29mMguKbYl5b6Enhls0VWx/F3oDe+gfZ3p+ASXHPqZG8+e0BwDZh0QykZ3g8etSBL4yOEUi5PEhilECuny++NqFItHheyUXFFJih5qCqP8w+qiseVignIlRH/oumNXMt0HZUeWvh0G43Nc/6OdW2g2OtjUKjQ3WtbNP9Znx+okruUAzOrWpYN0V5PqE5FXrrsslykYb6ou3xThvmkowHddyl3x/koUd1nfra5YUAY9hzfFfUC8SdRg805OSy+EwI+dE006j91dR1EyNKZhqEg1Q5Wb2BGGRXbAYDOGeuX6NE9X+V2gKqD+kauxfz+t2f6lzWEueaexo8= - - -O=Guardtime,CN=H4 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -H4 - - - - O=Guardtime, CN=H4 - - - 2zNKmjgO3GbRjbtLb/2gxC95Ydg= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2014-12-05T10:40:35Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - - H5 - - - -MIICtjCCAZ4CAQEwDQYJKoZIhvcNAQELBQAwITELMAkGA1UEAxMCSDUxEjAQBgNVBAoTCUd1YXJkdGltZTAeFw0xNDEyMDgwOTAzNDdaFw0xNzAxMDgwOTAzNDdaMCExCzAJBgNVBAMTAkg1MRIwEAYDVQQKEwlHdWFyZHRpbWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC60wohNDbrmyAL/7WupGYRFg8sBizryJup1HDV/YJvhVAo7jt63nrzuxqnADeqlzeek2GuYugh5LbYRR8EeBtxE3ssIablc5TLKPZj1hzJ+Tsw39BrbYebQUwusxU+BUclQ9TpxgSAM6eXa5w2pi9o8eiHVMxzXQ5c5BE0XGSSH4IRRoej/xnealXgxNIFvEm14sFvkAg04WQQwD9ZTmWMY80WHeYDFr+v7N520r19GMyTc8YoR8DfWI0lLBYrcG1yDXu6gZlaLD+Xrb633Qn7WRgWD0ejCh9taWbEDBwoc6aM8yZDLfBsExYQSn8RMCcVXZjDZv5k7+IQaozgj0q7AgMBarkwDQYJKoZIhvcNAQELBQADggEBALnzytGvxyDEf8fDaErxIVaZpUcZrWSifiBc3jK3h3PvFTuaY98DT9keY2X1vM9mSeMBusRdMbIkFROA6+uUUNEXlp7lQEoZ9/N1H4vCGscvZWBOua668qw2PrUCQoD5pP1SDH/0JpK4wX+Xk8bdi+Q6cHu2p606r4PBtJVv2oR5y+LaghTC10pT+4+EQ8rDPmseiatvSa9dJdz3RM/bIR+Ki9OO5nBYpPBQJuvDTJ1rfWSfr7JD0ejDOVeG9OfN0j26L/sChV5uZxRMs/mvIlRibHqXU0+oeOGCCsZGb6YN27nLFh5TUdqtGRbJuu3f/8tYNLa7Gb/iI6afpO8nRXc= - - -O=Guardtime,CN=H5 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/withdrawn - 2016-07-01T00:00:00Z - - - - http://uri.etsi.org/TrstSvc/Svctype/TSA/QTST - -H5 - - - - O=Guardtime, CN=H5 - - - i8kh3VDj6mI46TJ0BxYTItfimzM= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2014-12-08T10:03:47Z - - - - - - -4TFqZWrbi9Orpxv1ZvjWNGnwsUnwUxFLGkUariuAEVw=RKToTfhxJzPRGavfTrRNNhYrk+VvNGYcINIe7XHSGuk=nuEnGSNY+udlIq2Yij6tdK1Z/yO7TqtSoCKkFoKiZ2FF96y10xbEEH/8oV6Wp0y8QV5I5w5buZeH -2f+FxPpsaM0u9V+tUBaBTHWpn8aON/1h8T/y5ARJLEgCXEjWSO0gdL3a1Z1KiqbjWg/CXvLjjf1K -XzVsRI0XVfsIvpvNfxEyvvBN1PfcnKLQUY3qdkExosIFhWdZZLL9SLegrjlagL/PcHNNavUhCnhy -1ryTPqsQZSzXuKBUt+TuqxfD5OR0e1TWxTcs34UaIBwPWNjeIJkQzUxueP7ZK0dET+xJjGpqEY6R -p8fWO+lxpvGZKTYe5AFhsV+asu4QX3davCkaZg==MIIDtDCCApygAwIBAgIJAOGr7PilHGMwMA0GCSqGSIb3DQEBBQUAMHExLjAsBgNVBAMTJUVzdG9u -aWFuIFRydXN0ZWQgTGlzdCBTY2hlbWUgT3BlcmF0b3IxCzAJBgNVBAYTAkVFMTIwMAYDVQQKEylF -c3RvbmlhbiBUZWNobmljYWwgU3VydmVpbGxhbmNlIEF1dGhvcml0eTAeFw0xMDEwMjkxMzIyNTBa -Fw0yMDExMDUxMzIyNTBaMHExLjAsBgNVBAMTJUVzdG9uaWFuIFRydXN0ZWQgTGlzdCBTY2hlbWUg -T3BlcmF0b3IxCzAJBgNVBAYTAkVFMTIwMAYDVQQKEylFc3RvbmlhbiBUZWNobmljYWwgU3VydmVp -bGxhbmNlIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALhdQ9c33Y98 -JC0pl34+rg+qXLgdjEQaBM9gpxOpIpeqwrcXi5xbLmh4mk6imennbRaZXgJRqrOkx77B+UsBwn6u -PgeZenJ1kFGvAOR9aePbgxJ5AggMr4wJXSa03OSGDhptsmMFc86qtnht94mDf1UCn1CNYA7qQHzu -4MQwqJ2Ist7IIki89VZD5I4Y5AItMKlEjnHAOw/dlMfI8SxE2vvxCIyQu+rhfGPfwotHi0POyKtk -X9Y+JSqEVqRXNw7B2x+d9mRYUJ8EqDvj5ag9dtgyXLsfJ4HdUJMqvoT6QnfwlBbaFusTm3R8SNVX -l/8LHDoM5naOSKAOGRSe2OnxAJ8CAwEAAaNPME0wDAYDVR0TBAUwAwIBADALBgNVHQ8EBAMCB4Aw -HQYDVR0OBBYEFAon+QooAKxPsgZlsTxvK/8synsxMBEGA1UdJQQKMAgGBgQAkTcDADANBgkqhkiG -9w0BAQUFAAOCAQEACansBzvd2iwBlZg50oueEtUlFyE+do+FmI4apydq2bM3kdeikWGERSbV1EzD -86j7jpNKEOvlPTkV7fZl+7uCJ3OuCrzHEzuaZnvFPkN7Rmj4P1AGh5UK4UVWJwTceuhzIf4D6+/5 -CNY6U8iEHIqvAmTVOPSKEvxdBv7GKHy6x897icQa8ttHq+xCLmc0+6zpbzSZ5dOmFG3kzJuZPqtq -a89Lqf7x6IRRKgUd+C+JsKDMjEde/eYnM8yxdVlzEWe6Z0qKVvPTuiCnhTNhaaQM3aiw61RMTes2 -Ik4wSGY75XZjQV5gVszHJBEntktcduGWCuJ24qS2lb1M2/8bE43Fkg==O=Estonian Technical Surveillance Authority, C=EE, CN=Estonian Trusted List Scheme Operator16261351432217453360uF1D1zfdj3wkLSmXfj6uD6pcuB2MRBoEz2CnE6kil6rCtxeLnFsuaHiaTqKZ6edtFpleAlGqs6TH -vsH5SwHCfq4+B5l6cnWQUa8A5H1p49uDEnkCCAyvjAldJrTc5IYOGm2yYwVzzqq2eG33iYN/VQKf -UI1gDupAfO7gxDConYiy3sgiSLz1VkPkjhjkAi0wqUSOccA7D92Ux8jxLETa+/EIjJC76uF8Y9/C -i0eLQ87Iq2Rf1j4lKoRWpFc3DsHbH532ZFhQnwSoO+PlqD122DJcux8ngd1Qkyq+hPpCd/CUFtoW -6xObdHxI1VeX/wscOgzmdo5IoA4ZFJ7Y6fEAnw==AQAB2016-12-27T06:09:29ZvWUAiajqPKb4O6Z9IbUz2Jbw85c/Y13Q0xm/QNGFJgo=O=Estonian Technical Surveillance Authority, C=EE, CN=Estonian Trusted List Scheme Operator16261351432217453360 \ No newline at end of file diff --git a/MoppLib/MoppLib/TSL cache/FI.xml b/MoppLib/MoppLib/TSL cache/FI.xml deleted file mode 100644 index a292e1f5a..000000000 --- a/MoppLib/MoppLib/TSL cache/FI.xml +++ /dev/null @@ -1,333 +0,0 @@ - - - 5 - 22 - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - Finnish Communications Regulatory Authority - FICORA - FICORA - Viestintavirasto - - - - - Itamerenkatu 3A - Helsinki - 00181 - FI - - - - mailto:kirjaamo@ficora.fi - http://www.viestintavirasto.fi/en/index.html - - - - FI:Trusted list including information related to the qualified trust service providers which are supervised by the issuing Member State, together with information related to the qualified trust services provided by them, in accordance with the relevant provisions laid down in Regulation (EU) No 910/2014 of the European Parliament and of the Council of 23 July 2014 on electronic identification and trust services for electronic transactions in the internal market and repealing Directive 1999/93/EC. - - - https://www.viestintavirasto.fi/en/informationsecurity/electronicidentificationandsignature/registerofcertificationauthoritiesprovidingqualifiedcertificates.html - - http://uri.etsi.org/TrstSvc/TrustedList/StatusDetn/EUappropriate - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/FI - - FI - - The applicable legal framework for the present trusted list is Regulation (EU) No 910/2014 of the European Parliament and of the Council of 23 July 2014 on electronic identification and trust services for electronic transactions in the internal market and repealing Directive 1999/93/EC. - Tämän Suomen valvottuja/akkreditoituja varmennepalvelujen tarjoajia koskevan luotetun luettelon TSL- toteutuksen suhteen noudatettava lakikehys on Euroopan parlamentin ja neuvoston direktiivi 1999/93/EY, annettu 13 päivänä joulukuuta 1999, sähköisiä allekirjoituksia koskevista yhteisön puitteista sekä sen implementointi Suomen laissa. - - 65535 - - - - - - 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 - - - - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl-mp.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUlistofthelists - - - EU - - - application/vnd.etsi.tsl+xml - - - - European Commission - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUlistofthelists - - - - - - 2016-12-21T01:00:00Z - - 2017-05-23T00:00:00Z - - - https://www.viestintavirasto.fi/attachments/TSL-Ficora.xml - https://www.viestintavirasto.fi/attachments/HumanReadable_TSL-Ficora.xml.pdf - - - - - - - Population Register Centre - Vaestorekisterikeskus - VRK - - - NTRFI-0245437-2 - Vaestorekisterikeskus CA - - - - - P.O.Box 123 - Helsinki - 00531 - FI - - - - mailto:kirjaamo@vrk.fi - http://www.vrk.fi/en - - - - http://vrk.fi/en/frontpage - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - - VRK Gov. CA for Citizen Qualified Certificates - - - -MIIFjDCCBHSgAwIBAgIDAYiZMA0GCSqGSIb3DQEBBQUAMIGjMQswCQYDVQQGEwJGSTEQMA4GA1UECBMHRmlubGFuZDEhMB8GA1UEChMYVmFlc3RvcmVraXN0ZXJpa2Vza3VzIENBMSkwJwYDVQQLEyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBTZXJ2aWNlczEZMBcGA1UECxMQVmFybWVubmVwYWx2ZWx1dDEZMBcGA1UEAxMQVlJLIEdvdi4gUm9vdCBDQTAeFw0wMzAxMTAxMjU5MDVaFw0xOTAxMDkxMjU4MzBaMIGhMQswCQYDVQQGEwJGSTEQMA4GA1UECBMHRmlubGFuZDEhMB8GA1UEChMYVmFlc3RvcmVraXN0ZXJpa2Vza3VzIENBMSQwIgYDVQQLExtWYWx0aW9uIGthbnNhbGFpc3Zhcm1lbnRlZXQxNzA1BgNVBAMTLlZSSyBHb3YuIENBIGZvciBDaXRpemVuIFF1YWxpZmllZCBDZXJ0aWZpY2F0ZXMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC5Aj527olxDHOtkQQU+BG1FUs0xOy8Qw2z3NmgV7yOkYRwi/C7aAbvaye712q8APGiDa+Pf0N/XzQNynWWyzC2krv+fQq5YjGypRbnvciAtGbJQSXBoX58eV6sd5CWLKGMo1gHxsXNU6L9v9XlSWLUH4xbYvQt+oxfptgJbK5E+71OYC8DL0KU6xmlEfuPNQZ1Rf3pqqlEfmQjP24ubcgy3ZAHVTFBh7rT66pw+L5zAVPYBCyUG7rdXHS9hulRa4Y8w3BFRBxbChHsc7tuKk9kQmNGhQAJ7CdJx3V5kPsrxnuztOunimeBKoB5X3wgvk9f64n60Jp0qumnY4l9V6oZAgMBAAGjggHHMIIBwzASBgNVHRMBAf8ECDAGAQH/AgEAMBEGCWCGSAGG+EIBAQQEAwIBBjCBywYDVR0gBIHDMIHAMIG9BgkqgXaEBQEKAQEwga8wgYQGCCsGAQUFBwICMHgadlZhcm1lbm5lcG9saXRpaWtrYSBvbiBzYWF0YXZpbGxhIC0gQ2VydGlmaWthdCBwb2xpY3kgZmlubnMgLSBDZXJ0aWZpY2F0ZSBwb2xpY3kgaXMgYXZhaWxhYmxlIGh0dHA6Ly93d3cuZmluZWlkLmZpL2NwczEwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuZmluZWlkLmZpL2NwczEvMEIGCCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAoYmaHR0cDovL3Byb3h5LmZpbmVpZC5maS9jYS92cmtyb290Yy5jcnQwDgYDVR0PAQH/BAQDAgHGMB8GA1UdIwQYMBaAFNvp4ZvS0SQL/KvjoGfqrpxLd/SwMDgGA1UdHwQxMC8wLaAroCmGJ2h0dHA6Ly9wcm94eS5maW5laWQuZmkvYXJsL3Zya3Jvb3RhLmNybDAdBgNVHQ4EFgQUiFpvHUJHgob91+kNslfPTVAoBBcwDQYJKoZIhvcNAQEFBQADggEBAEXit6ypQO+0RbVTK57SKT1jsqE8dUiwL8oevvdBiFpR4HxEZZy8e/OGAvF3Hc/Hjc8cOjlsYToqztg16cOFI4vHZ+yC8rWh4TpuWgvkS80h//jcweAayp6E/Z0z928vTNILBD34YJQvpU4u7jyhSaY3tzybKjlSAo5lahiI32a9MNZXGoNv+j+MKq1NJkpgpy6/VEa5Z4RdRx43/EZhs45WvxTfER+nUC1loQngFKOSjdWG3GhOAh13nM9jYASBtC7ONddvoByfzwUOQ+BOf08R2bvZA+2CDFI8PuYqxCFvBMCpQSCdVL6tEYxeWIQb+uIQsfAEfjC3AQuTNh/UiW8= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-06-30T22:00:00Z - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - -VRK Gov. CA for Citizen Qualified Certificates - - - - CN=VRK Gov. CA for Citizen Qualified Certificates, OU=Valtion kansalaisvarmenteet, O=Vaestorekisterikeskus CA, ST=Finland, C=FI - - - iFpvHUJHgob91+kNslfPTVAoBBc= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2003-03-31T10:00:00Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - - VRK Gov. CA for Citizen Qualified Certificates - G2 - - - -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 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-06-30T22:00:00Z - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - -VRK Gov. CA for Citizen Qualified Certificates - G2 - - - - CN=VRK Gov. CA for Citizen Qualified Certificates - G2, OU=Valtion kansalaisvarmenteet, O=Vaestorekisterikeskus CA, C=FI - - - wa8dil8dmocNghD8nd31sB5w07U= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2014-01-08T11:00:00Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - - VRK CA for Qualified Certificates - - - -MIIFejCCBGKgAwIBAgIDAYiaMA0GCSqGSIb3DQEBBQUAMIGjMQswCQYDVQQGEwJGSTEQMA4GA1UECBMHRmlubGFuZDEhMB8GA1UEChMYVmFlc3RvcmVraXN0ZXJpa2Vza3VzIENBMSkwJwYDVQQLEyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBTZXJ2aWNlczEZMBcGA1UECxMQVmFybWVubmVwYWx2ZWx1dDEZMBcGA1UEAxMQVlJLIEdvdi4gUm9vdCBDQTAeFw0wMzAxMTQwNzU3MDJaFw0xOTAxMTMwNzU2MTBaMIGPMQswCQYDVQQGEwJGSTEQMA4GA1UECBMHRmlubGFuZDEhMB8GA1UEChMYVmFlc3RvcmVraXN0ZXJpa2Vza3VzIENBMR8wHQYDVQQLExZPcmdhbmlzYWF0aW92YXJtZW50ZWV0MSowKAYDVQQDEyFWUksgQ0EgZm9yIFF1YWxpZmllZCBDZXJ0aWZpY2F0ZXMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCxGO4peMUc0UklH4cTBXBs8I3/BpGUvNYMSvN9wkMe8zJxW7eLuOAuNrbQUdLE57hzOOjYY67LP2zGyWCU5codtdpT+M+qTgdohtGZwPw1FyNOp1aiDjjVLCBBKEzxfVWrglzmf4zPIF1jJBKspUuJtjWkdtqcNCeb9ZPV8J9yS6+V7TTUGv63VCx48AfkWegKRHrBJxtby07P4liRpoQgZ4uYy2sD3rHuQnv3ukbx3VxtMKHLAGwzQa/yBPGcFha5IeWnONTx+3YrJYTysKvtE7z302tQvpl+WFTsOXKhsM7/TEf+EerUqY7P36H/qUvyFsvvzotRP858s4r3eQlRAgMBAAGjggHHMIIBwzASBgNVHRMBAf8ECDAGAQH/AgEAMBEGCWCGSAGG+EIBAQQEAwIBBjCBywYDVR0gBIHDMIHAMIG9BgkqgXaEBQEKAQIwga8wgYQGCCsGAQUFBwICMHgadlZhcm1lbm5lcG9saXRpaWtrYSBvbiBzYWF0YXZpbGxhIC0gQ2VydGlmaWthdCBwb2xpY3kgZmlubnMgLSBDZXJ0aWZpY2F0ZSBwb2xpY3kgaXMgYXZhaWxhYmxlIGh0dHA6Ly93d3cuZmluZWlkLmZpL2NwczIwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuZmluZWlkLmZpL2NwczIvMEIGCCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAoYmaHR0cDovL3Byb3h5LmZpbmVpZC5maS9jYS92cmtyb290Yy5jcnQwDgYDVR0PAQH/BAQDAgHGMB8GA1UdIwQYMBaAFNvp4ZvS0SQL/KvjoGfqrpxLd/SwMDgGA1UdHwQxMC8wLaAroCmGJ2h0dHA6Ly9wcm94eS5maW5laWQuZmkvYXJsL3Zya3Jvb3RhLmNybDAdBgNVHQ4EFgQUVBoCN4+OY9+P8DAjSqj8Z1fwU6gwDQYJKoZIhvcNAQEFBQADggEBAF9FRZ3uzOv7VtEy/AudyUgNXmqgt7a2hns6jjGUegvZThpHESJ3SAz1dtIXbmQ1XM0j8CKb5GRmgBMMbqXgWVEuvw6Jikh0If9TYMtnw0y5QDZig1rmCvwZnz/LR9IkcqU7MdaWFDPOQzDfnZX90cerh+bn9DuHhcZ3xtiy9OwXOVpp8w8rcoVY4+3A1Sn1QmNsEsuxZDoKZiwNZn87IKRj5h5okh3Tsu8XXtV+Lc4bQnY2mtDA0vMgZ9KJlM6NwrXOc4f9unALJkyX3Ygd2DfvrIKOJlKIm7/c91Xc9vBW8uGlFDOyzdhhcDYt30Gb1eBcLxxSdkcuIFcIq7cMyvE= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-06-30T22:00:00Z - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - -VRK CA for Qualified Certificates - - - - CN=VRK CA for Qualified Certificates, OU=Organisaatiovarmenteet, O=Vaestorekisterikeskus CA, ST=Finland, C=FI - - - VBoCN4+OY9+P8DAjSqj8Z1fwU6g= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2003-03-31T10:00:00Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - - VRK CA for Qualified Certificates - G2 - - - -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 - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-06-30T22:00:00Z - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - -VRK CA for Qualified Certificates - G2 - - - - CN=VRK CA for Qualified Certificates - G2, OU=Organisaatiovarmenteet, O=Vaestorekisterikeskus CA, C=FI - - - VqlXr9YxfnHWLboO4+6KExTKKdc= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2014-01-08T11:00:00Z - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - - VRK CA for Healthcare Professionals Qualified Certificates - - - -MIIFjDCCBHSgAwIBAgIDAaZVMA0GCSqGSIb3DQEBBQUAMIGjMQswCQYDVQQGEwJGSTEQMA4GA1UECBMHRmlubGFuZDEhMB8GA1UEChMYVmFlc3RvcmVraXN0ZXJpa2Vza3VzIENBMSkwJwYDVQQLEyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBTZXJ2aWNlczEZMBcGA1UECxMQVmFybWVubmVwYWx2ZWx1dDEZMBcGA1UEAxMQVlJLIEdvdi4gUm9vdCBDQTAeFw0xMDEwMjcxMTQxMjZaFw0yMzEyMTcxOTU5NTlaMIG0MQswCQYDVQQGEwJGSTEQMA4GA1UECBMHRmlubGFuZDEhMB8GA1UEChMYVmFlc3RvcmVraXN0ZXJpa2Vza3VzIENBMSswKQYDVQQLEyJUZXJ2ZXlkZW5odW9sbG9uIGFtbWF0dGl2YXJtZW50ZWV0MUMwQQYDVQQDEzpWUksgQ0EgZm9yIEhlYWx0aGNhcmUgUHJvZmVzc2lvbmFscyBRdWFsaWZpZWQgQ2VydGlmaWNhdGVzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr+HbiIMhxbvT7n7lF4DpnO1ICRXEUleN6eo//szmbvONfNaJtjKlz6rYGMlH1m3DNVlCn5RVHkXb9pNCxXYoqBV00RO/Ry7nEy0dB/ZVlck80CUIHtK5sYC9RKe0YSa3xQKA5xhPFcy6wxmE6jeqs0r32S+qvbUU5VejHTfU+cTghwLiE0XLwBTjK5cX8S8gGHsZvgJUvID/g94l6AaOC3xOVSezGWW2VJicMUl1n/dNpjQsyten03TRjGWI5Tg27wNZvGbQZjwuXWkb+NzAG7lcq4WzCb9Sp/dG+G5AAeU/JWt7fmabQxxFSjv7sg0koJCxWkRdhXkNRL332qRQYwIDAQABo4IBtDCCAbAwEgYDVR0TAQH/BAgwBgEB/wIBADCBywYDVR0gBIHDMIHAMIG9BgkqgXaEBQEKAQcwga8wgYQGCCsGAQUFBwICMHgadlZhcm1lbm5lcG9saXRpaWtrYSBvbiBzYWF0YXZpbGxhIC0gQ2VydGlmaWthdCBwb2xpY3kgZmlubnMgLSBDZXJ0aWZpY2F0ZSBwb2xpY3kgaXMgYXZhaWxhYmxlIGh0dHA6Ly93d3cuZmluZWlkLmZpL2NwczYwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuZmluZWlkLmZpL2NwczYvMEIGCCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAoYmaHR0cDovL3Byb3h5LmZpbmVpZC5maS9jYS92cmtyb290Yy5jcnQwDgYDVR0PAQH/BAQDAgHGMB8GA1UdIwQYMBaAFNvp4ZvS0SQL/KvjoGfqrpxLd/SwMDgGA1UdHwQxMC8wLaAroCmGJ2h0dHA6Ly9wcm94eS5maW5laWQuZmkvYXJsL3Zya3Jvb3RhLmNybDAdBgNVHQ4EFgQUzRt/1lZfBvUKKTJe6i1snCZYABIwDQYJKoZIhvcNAQEFBQADggEBAGGkQW99duGBicXk4r2Q9tspbIHDbvum7+ARNjxNuTtMlXOEQzXhA98Ai33fY6WOq1MMV9wTuNfjacvTB5H0hWjmMSWEqOCS/Xvt1Mn/+hWvRu1el6eRf9euAfMJmFxsS3fwcdrY4g/O4yuM2dc/mb8Ziyz33mm7p0qGYcMZxqADcUnczezPf2CV/qZHaxGS7if0sEoNC04KnPg/4WbcqzbwrPaGTd/m+TX4DhY4SyehMCbI3yxwuOK2VHkGKDPRDo2zH5yHL+0MxCu9N7wMuq3n5WxbVL/B+Bv+6ccLYL0H6c+3SIkpESiNU9Gx2TJf/PcO37Nbj/RN0jY4UZPRed4= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/granted - 2016-06-30T22:00:00Z - - - - http://uri.etsi.org/TrstSvc/TrustedList/SvcInfoExt/ForeSignatures - - - - - - - http://uri.etsi.org/TrstSvc/Svctype/CA/QC - -VRK CA for Healthcare Professionals Qualified Certificates - - - - CN=VRK CA for Healthcare Professionals Qualified Certificates, OU=Terveydenhuollon ammattivarmenteet, O=Vaestorekisterikeskus CA, ST=Finland, C=FI - - - zRt/1lZfBvUKKTJe6i1snCZYABI= - - - http://uri.etsi.org/TrstSvc/TrustedList/Svcstatus/undersupervision - 2010-12-01T11:00:00Z - - - - - - 2+s5x7Y0anJnqoOY4Gkpken7IjBoiHJyKIiGPXQOLWU=ljR+1+GDCAYLAnIVRYlHQ7gdtBOBCoVkyDc2bthsJGs=g/68dMXL3R5klThWCTe0/XAerNyoellbnduIaljbjaBuGSFir0JvLCOW+11GO4PrgzsWCbwIaZy9NofO+FpYz7n1Rk2n4K2eQCZnpzQnVudYv4s8MOujM/2TsCeVQBS5lqcCVVnR0hqkBkBJ34N5NK9yGa2BIY1CrXyxuICduoKiTydZMZakC4HK2DzQneeRzJD4kNV1lP55BKsBn4VdPzaL0tALcj0AWB7Kyz8kp1nd7JE+XmG7hb+YLYUQJCfFgin+B6d3mujniLRujdUvyBIfXKXN4ZCbkEdQxuq67GoBuCuMOoiKhgGZaItPHiVtsA3OhiWunbA8l96d4QonX5YOy8Mf2198o6pBp/i4U91o3y2/LIoUzCTJY6U8vMEfgHchv2PNxa4claQ1FIqFvOTGG/FqG2mwbw8IwHFTIwyB+2ytqaOq7pfo4Oyk6JxIVDPvPPTM/hwBxJnFiQ2OwmyyiqCGQuY4l3JiaVfxpK113cBKq3qvBYJzDgew+I57PFQro/pidINhYnQ24NXBddxOpdRdCN/kPIB8L6+n/XQxpOKjckwcBsdM0eWWbO5U1NqMeym0q3DlQLISJL7e6Hr/45g5lyrvH9vPmEG/2PLH55eFuYPZ7jvdtu+/2vR9/yeHkNJiSz6zmAFpOpBUtXLozqr2g3RMc/sb32H/34M=o/zafbAvrEoYqzZ+7LfmjBXLWwU7lmSYorf4x3pHM71iqTFreyY1onmREpHXEhHwzfGYrvGtKy7AYHChinTcVtRGqSYORqJRPtD9NZIJQsUKbTqlJHPLfeN6dUzrA8f7tb0h452leUsgrqoWwWiTk2azhnjz8mjjCr0PwvxKgbqJX2HxAtU66wu09DQPbdBdzLShb3KxT3xIDj5qnKhyX5zoW/YqeB0szp9PalJbSSrJmf4fb9qnFHZozeh+6JDHnNT453/DOaBGZNDK/vmQBDh0A33Dfa81SnZVB9rnJMB3zhdAWHHacp+468uwQPZQzPJPwZzZhPv4Q2FBljgxfJ8PaqnFoEzAZ4AL13hgKGRKuy+GP5/4wEmhwWjKzwefhRXzN20KdcrveGj2lXproqRt7VTi8JyUeyE0F21Y8ISvqFXNzle5TAXJ7pna8D5UEw79pGDQxPfmoGbCJXW/OpwMxeyr09xPQWFviovDia4aYgpGRDg+lYzDgVmF6QdbfUKED/BzV/PvtxdJ+t+8PQ38g/BG24Tw/TJsmHve//485fHVSVWyqdOBDPnWIm0u7d07/b01z/2awbV5VfvhTd3O1+DBZnktQaphhnFhDS4E8ufsGpd+XP05fIuMP/Q7IjsHlE7QKROJW3dGI2A5UbaSGR7+a1sc2CmX+UMryQM=AQABCN=Finnish Communications Regulatory Authority, O=Finnish Communications Regulatory Authority, L=Helsinki, C=FI87466719663CN=Finnish Communications Regulatory Authority, O=Finnish Communications Regulatory Authority, L=Helsinki, C=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2016-12-22T12:52:18.132ZqbaZKuGS8q8yCCXx9u3NrRum85PYbAIjS2i5FFsnfgE=CN=Finnish Communications Regulatory Authority, O=Finnish Communications Regulatory Authority, L=Helsinki, C=FI87466719663Content-Type: text/xml; charset=UTF-8; name="doc.xml"text/xml - \ No newline at end of file diff --git a/MoppLib/MoppLib/TSL cache/tl-mp.xml b/MoppLib/MoppLib/TSL cache/tl-mp.xml deleted file mode 100644 index 002bd221b..000000000 --- a/MoppLib/MoppLib/TSL cache/tl-mp.xml +++ /dev/null @@ -1,2135 +0,0 @@ - - - 5 - 160 - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUlistofthelists - - European Commission - Европейска комисия - Comisión Europea - Evropská komise - Europa-Kommissionen - Europäische Kommission - Euroopa Komisjon - Ευρωπαϊκή Επιτροπή - Commission européenne - Commissione europea - Eiropas Komisija - Europos Komisija - Európai Bizottság - Il-Kummissjoni Ewropea - Europese Commissie - Komisja Europejska - Comissão Europeia - Comisia Europeană - Európska komisia - Evropska komisija - Euroopan komissio - Europeiska kommissionen - Europska komisija - - - - - Rue de la Loi 200 - Bruxelles - 1049 - BE - - - Wetstraat 200 - Brussel - 1049 - BE - - - Rue de la Loi/Wetstraat 200 - Brussels - 1049 - BE - - - - mailto:EC-TL-Service@ec.europa.eu - https://ec.europa.eu/digital-agenda/en/eu-trusted-lists-certification-service-providers - - - - EU:Trusted list including information related to the qualified trust service providers which are supervised by the issuing Member State, together with information related to the qualified trust services provided by them, in accordance with the relevant provisions laid down in Regulation (EU) No 910/2014 of the European Parliament and of the Council of 23 July 2014 on electronic identification and trust services for electronic transactions in the internal market and repealing Directive 1999/93/EC. - EU:Списък, съдържащ в съответствие с член 2, параграф 4 от Решение 2009/767/ЕО на Комисията от 16 октомври 2009 г. за определяне на мерки, улесняващи прилагането на процедури с помощта на електронни средства чрез единични звена за контакт в съответствие с Директива 2006/123/ЕО на Европейския парламент и на Съвета относно услугите на вътрешния пазар, изменено с Решение 2010/425/ЕС на Комисията и Решение 2013/662/ЕС за изпълнение на Комисията, информацията, съобщена от държавите членки съгласно член 2, параграф 3 от Решение 2009/767/ЕО на Комисията. - EU:De conformidad con el artículo 2, apartado 4, de la Decisión 2009/767/CE de la Comisión, de 16 de octubre de 2009, por la que se adoptan medidas que facilitan el uso de procedimientos por vía electrónica a través de las «ventanillas únicas» con arreglo a la Directiva 2006/123/CE del Parlamento Europeo y del Consejo relativa a los servicios en el mercado interior, modificada por la Decisión 2010/425/UE de la Comisión y por la Decisión de Ejecución 2013/662/UE de la Comisión, la presente lista contiene la información proporcionada por los Estados miembros según lo previsto en el artículo 2, apartado 3, de la Decisión 2009/767/CE de la Comisión. - EU:Seznam zveřejněný podle čl. 2 odst. 4 rozhodnutí Komise 2009/767/ES ze dne 16. října 2009, kterým se stanovují opatření pro usnadnění užití postupů s využitím elektronických prostředků prostřednictvím „jednotných kontaktních míst“ podle směrnice Evropského parlamentu a Rady 2006/123/ES o službách na vnitřním trhu, ve znění rozhodnutí Komise 2010/425/EU a prováděcího rozhodnutí Komise 2013/662/EU, který obsahuje informace oznámené členskými státy v souladu s čl. 2 odst. 3 rozhodnutí Komise 2009/767/ES. - EU:Listen indeholder, jf. artikel 2, stk. 4, i Kommissionens beslutning 2009/767/EF af 16. oktober 2009 om fastlæggelse af foranstaltninger, der skal lette anvendelsen af elektroniske procedurer ved hjælp af "kvikskranker" i henhold til Europa-Parlamentets og Rådets direktiv 2006/123/EF om tjenesteydelser i det indre marked, som ændret ved Kommissionens afgørelse 2010/425/EU og Kommissionens gennemførelsesafgørelse 2013/662/EU, de oplysninger, der indgives af medlemsstaterne i henhold til artikel 2, stk. 3, i Kommissionens beslutning 2009/767/EF. - EU:Liste, die in Übereinstimmung mit Artikel 2 Absatz 4 der Entscheidung 2009/767/EG der Kommission vom 16. Oktober 2009 über Maßnahmen zur Erleichterung der Nutzung elektronischer Verfahren über „einheitliche Ansprechpartner“ gemäß der Richtlinie 2006/123/EG des Europäischen Parlaments und des Rates über Dienstleistungen im Binnenmarkt – geändert durch den Beschluss 2010/425/EU der Kommission und den Durchführungsbeschluss 2013/662/EU der Kommission – die von den Mitgliedstaaten gemäß Artikel 2 Absatz 3 der Entscheidung 2009/767/EG der Kommission übermittelten Informationen enthält: - EU:Nimekiri kooskõlas komisjoni 16. oktoobri 2009. aasta otsuse 2009/767/EÜ (millega kehtestatakse meetmed elektrooniliste haldustoimingute kasutamise lihtsustamiseks ühtsete kontaktpunktide kaudu, mis on sätestatud Euroopa Parlamendi ja nõukogu direktiivis 2006/123/EÜ teenuste kohta siseturul; muudetud komisjoni otsusega 2010/425/EL ja komisjoni rakendusotsusega 2013/662/EL) artikli 2 lõikega 4; nimekirjas esitatakse teave, mille liikmesriigid on edastanud komisjoni otsuse 2009/767/EÜ artikli 2 lõike 3 kohaselt. - EU:Ο παρών κατάλογος περιέχει - σύμφωνα με το άρθρο 2 παράγραφος 4 της απόφασης 2009/767/ΕΚ της Επιτροπής, της 16ης Οκτωβρίου 2009, σχετικά με τη θέσπιση μέτρων που διευκολύνουν τη χρήση διαδικασιών με ηλεκτρονικά μέσα μέσω των ενιαίων κέντρων εξυπηρέτησης βάσει της οδηγίας 2006/123/ΕΚ του Ευρωπαϊκού Κοινοβουλίου και του Συμβουλίου σχετικά με τις υπηρεσίες στην εσωτερική αγορά, όπως τροποποιήθηκε με την απόφαση 2010/425/ΕΕ της Επιτροπής και την εκτελεστική απόφαση 2013/662/ΕΕ της Επιτροπής - τις πληροφορίες που κοινοποιούνται από τα κράτη μέλη σύμφωνα με το άρθρο 2 παράγραφος 3 της απόφασης 2009/767/ΕΚ της Επιτροπής. - EU:Liste contenant, par application de l’article 2, paragraphe 4, de la décision 2009/767/CE de la Commission du 16 octobre 2009 établissant des mesures destinées à faciliter l’exécution de procédures par voie électronique par l’intermédiaire des «guichets uniques» conformément à la directive 2006/123/CE du Parlement européen et du Conseil relative aux services dans le marché intérieur, telle que modifiée par la décision 2010/425/UE de la Commission et la décision d'exécution 2013/662/UE de la Commission, les informations communiquées par les États membres en application de l'article 2, paragraphe 3, de la décision 2009/767/CE de la Commission. - EU:Conformemente all'articolo 2, paragrafo 4, della decisione 2009/767/CE della Commissione, del 16 ottobre 2009, che stabilisce misure per facilitare l'uso di procedure per via elettronica mediante gli "sportelli unici" di cui alla direttiva 2006/123/CE del Parlamento europeo e del Consiglio relativa ai servizi nel mercato interno, modificata dalla decisione 2010/425/UE della Commissione e dalla decisione di esecuzione 2013/662/UE della Commissione, il presente elenco UE contiene le informazioni comunicate dagli Stati membri a norma dell'articolo 2, paragrafo 3, della decisione 2009/767/CE. - EU:Saraksts, kas saskaņā ar 2. panta 4. punktu Komisijas 2009. gada 16. oktobra Lēmumā 2009/767/EK par pasākumiem, lai veicinātu procedūru veikšanu elektroniski, izmantojot vienotos kontaktpunktus atbilstoši Eiropas Parlamenta un Direktīva 2006/123/EK par pakalpojumiem iekšējā tirgū, kurā grozījumi izdarīti ar Komisijas Lēmumu 2010/425/ES un Komisijas Īstenošanas Lēmumu 2013/662/ES, ietver informāciju, ko dalībvalstis paziņojušas saskaņā ar Komisijas Lēmuma 2009/767/EK 2. panta 3. punktu. - EU:Sąrašas, kuriame pagal 2009 m. spalio 16 d. Komisijos sprendimo 2009/767/EB, kuriuo pagal Europos Parlamento ir Tarybos direktyvą 2006/123/EB dėl paslaugų vidaus rinkoje nustatomos priemonės procedūroms, atliekamoms naudojantis elektroninėmis priemonėmis ir kontaktinių centrų paslaugomis, palengvinti, su pakeitimais, padarytais Komisijos sprendimu 2010/425/ES ir Komisijos įgyvendinimo sprendimu 2013/662/ES, 2 straipsnio 4 dalį pateikiama informacija, kurią valstybės narės pateikė pagal Komisijos sprendimo 2009/767/EB 2 straipsnio 3 dalį. - EU:Jegyzék, amely az eljárásoknak a belső piaci szolgáltatásokról szóló 2006/123/EK európai parlamenti és tanácsi irányelv szerinti egyablakos ügyintézési pontokon keresztül elektronikus eszközökkel történő teljesítését lehetővé tevő rendelkezések meghatározásáról szóló, a 2010/425/EU bizottsági határozattal és a 2013/662/EU bizottsági végrehajtási határozattal módosított, 2009. október 16-i 2009/767/EK bizottsági határozat 2. cikkének (4) bekezdésével összhangban tartalmazza a tagállamok által a 2009/767/EK bizottsági határozat 2. cikke (3) bekezdésének megfelelően bejelentett információkat. - EU:Lista li fiha, skont l-Artikolu 2(4) tad-Deċiżjoni tal-Kummissjoni 2009/767/KE tas-16 ta’ Ottubru 2009 li tistipula miżuri li jiffaċilitaw l-użu ta’ proċeduri b’mezzi elettroniċi permezz tal-punti ta’ kuntatt waħdieni skont id-Direttiva 2006/123/KE tal-Parlament Ewropew u tal-Kunsill dwar is-servizzi fis-suq intern, kif emendata mid-Deċiżjoni tal-Kummissjoni 2010/425/UE u mid-Deċiżjoni ta' Implimentazzjoni tal-Kummissjoni 2013/662/UE, l-informazzjoni notifikata mill-Istati Membri skont l-Artikolu 2(3) tad-Deċiżjoni tal-Kummissjoni 2009/767/KE. - EU:Lijst waarin overeenkomstig artikel 2, lid 4, van Beschikking 2009/767/EG van de Commissie van 16 oktober 2009 inzake maatregelen voor een gemakkelijker gebruik van elektronische procedures via het „één- loket” in het kader van Richtlijn 2006/123/EG van het Europees Parlement en de Raad betreffende diensten op de interne markt, zoals gewijzigd bij Besluit 2010/425/EU van de Commissie en Uitvoeringsbesluit 2013/662/EU van de Commissie, de informatie is opgenomen die door de lidstaten overeenkomstig artikel 2, lid 3, van Beschikking 2009/767/EG van de Commissie is medegedeeld. - EU:Wykaz zawierający, zgodnie z art. 2 ust. 4 decyzji Komisji 2009/767/WE z dnia 16 października 2009 r. ustanawiającej środki ułatwiające korzystanie z procedur realizowanych drogą elektroniczną poprzez „pojedyncze punkty kontaktowe” zgodnie z dyrektywą 2006/123/WE Parlamentu Europejskiego i Rady dotyczącą usług na rynku wewnętrznym, zmienioną decyzją Komisji 2010/425/UE i decyzją wykonawczą Komisji 2013/662/UE, informacje przekazane przez państwa członkowskie zgodnie z art. 2 ust. 3 decyzji Komisji 2009/767/WE. - EU:Lista contendo, em conformidade com o artigo 2.º, n.º 4, da Decisão 2009/767/CE da Comissão, de 16 de outubro de 2009, que determina medidas destinadas a facilitar a utilização de procedimentos informatizados através de «balcões únicos», nos termos da Diretiva 2006/123/CE do Parlamento Europeu e do Conselho relativa aos serviços no mercado interno, com a redação que lhe foi dada pela Decisão 2010/425/UE da Comissão e pela Decisão de Execução 2013/662/UE da Comissão, as informações notificadas pelos Estados-Membros nos termos do artigo 2.º, n.º 3, da Decisão 2009/767/CE da Comissão. - EU:Listă care conține, în conformitate cu articolul 2 alineatul (4) din Decizia 2009/767/CE a Comisiei din 16 octombrie 2009 de stabilire a unor măsuri de facilitare a utilizării procedurilor prin mijloace electronice prin intermediul „ghișeelor unice” în temeiul Directivei 2006/123/CE a Parlamentului European și a Consiliului privind serviciile în cadrul pieței interne, astfel cum a fost modificată prin Decizia 2010/425/UE a Comisiei și Decizia de punere în aplicare 2013/662/UE a Comisiei, informațiile notificate de statele membre în temeiul articolului 2 alineatul (3) din Decizia 2009/767/CE a Comisiei. - EU:Zoznam, ktorý obsahuje v súlade s článkom 2 ods. 4 rozhodnutia Komisie 2009/767/ES zo 16. októbra 2009, ktorým sa ustanovujú opatrenia na uľahčenie postupov elektronickými spôsobmi prostredníctvom „miest jednotného kontaktu“ podľa smernice Európskeho parlamentu a Rady 2006/123/ES o službách na vnútornom trhu, zmeneného rozhodnutím Komisie 2010/425/EÚ a vykonávacím rozhodnutím Komisie 2013/662/EÚ, informácie oznámené členskými štátmi podľa článku 2 ods. 3 rozhodnutia Komisie 2009/767/ES. - EU:Seznam, ki v skladu s členom 2(4) Odločbe Komisije 2009/767/ES z dne 16. oktobra 2009 o vzpostavitvi ukrepov za pospeševanje uporabe postopkov po elektronski poti s pomočjo enotnih kontaktnih točk po Direktivi 2006/123/ES Evropskega parlamenta in Sveta o storitvah na notranjem trgu, kakor je bila spremenjena s Sklepom Komisije 2010/425/EU in Izvedbenim sklepom Komisije 2013/662/EU, vsebuje informacije, ki jih države članice sporočijo v skladu s členom 2(3) Odločbe Komisije 2009/767/ES. - EU:Luettelo, joka sisältää toimenpiteistä sähköisten menettelyjen käytön edistämiseksi keskitettyjä asiointipisteitä käyttäen palveluista sisämarkkinoilla annetun Euroopan parlamentin ja neuvoston direktiivin 2006/123/EY mukaisesti 16 päivänä lokakuuta 2009 tehdyn komission päätöksen 2009/767/EY, sellaisena kuin se on muutettuna komission päätöksellä 2010/425/EU ja komission täytäntöönpanopäätöksellä 2013/662/EU, 2 artiklan 4 kohdan mukaisesti tiedot, jotka jäsenvaltiot ovat ilmoittaneet komission päätöksen 2009/767/EY 2 artiklan 3 kohdan mukaisesti: - EU:Förteckning som, i enlighet med artikel 2.4 i kommissionens beslut av den 16 oktober 2009 om åtgärder som underlättar användningen av förfaranden på elektronisk väg genom gemensamma kontaktpunkter i enlighet med Europaparlamentets och rådets direktiv 2006/123/EG om tjänster på den inre marknaden, ändrat genom kommissionens beslut 2010/425/EU och kommissionens genomförandebeslut 2013/662/EU, innehåller den information som medlemsstaterna lämnat i enlighet med artikel 2.3 i kommissionens beslut 2009/767/EG. - EU:Popis koji, u skladu s člankom 2. stavkom 4. Odluke Komisije 2009/767/EZ od 16. listopada 2009. o utvrđivanju mjera kojima se olakšava uporaba postupaka elektroničkim putem preko „jedinstvenih kontaktnih točaka” u skladu s Direktivom 2006/123/EZ Europskog parlamenta i Vijeća o uslugama na unutarnjem tržištu, kako je izmijenjena Odlukom Komisije 2010/425/EU i Provedbenom odlukom Komisije 2013/662/EU, sadržava informacije o kojima su države članice izvijestile u skladu s člankom 2. stavkom 3. Odluke Komisije 2009/767/EZ: - - - http://eur-lex.europa.eu/legal-content/EN/TXT/?uri=uriserv:OJ.C_.2016.233.01.0001.01.ENG - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#en - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#bg - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#es - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#cs - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#da - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#de - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#et - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#el - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#fr - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#it - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#lv - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#lt - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#hu - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#mt - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#nl - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#pl - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#pt - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#ro - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#sk - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#sl - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#fi - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#sv - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl.html#hr - - http://uri.etsi.org/TrstSvc/TrustedList/StatusDetn/EUlistofthelists - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUlistofthelists - - EU - - In accordance with Art. 4(3) of Commission Implementing Decision (EU) 2015/1505 of 8 September 2015 laying down technical specifications and formats relating to trusted lists pursuant to Article 22(5) of Regulation (EU) No 910/2014 of the European Parliament and of the Council on electronic identification and trust services for electronic transactions in the internal market, the present list contains the information notified by Member States pursuant to Art. 4(1) and Art. 4(2) of Commission Implementing Decision (EU) 2015/1505. -The European Commission maintains this website as an interoperability tool designed to facilitate the practical use of national Trusted Lists. Our goal is to keep this information timely and accurate. If errors are brought to our attention, we will try to correct them. However, the Commission accepts no responsibility or liability whatsoever with regard to the content of national Trusted Lists which lies exclusively with the Member States. -It is our goal to minimise disruption caused by technical errors. However, some data or information on our site may have been created or structured in files or formats that are not error-free and we cannot guarantee that our service will not be interrupted or otherwise affected by such problems. The European Commission accepts no responsibility with regard to such problems incurred as a result of using this site or any linked external sites. -This disclaimer is not intended to limit the liability of the European Commission in contravention of any requirements laid down in applicable national law nor to exclude its liability for matters which may not be excluded under that law. - съгласно член 4, параграф 3 от Решение за изпълнение (ЕС) № 2015/1505 на Комисията от 8 септември 2015 г. за определяне на техническите спецификации и форматите на доверителните списъци съгласно член 22, параграф 5 от Регламент (ЕС) № 910/2014 на Европейския парламент и на Съвета относно електронната идентификация и удостоверителните услуги при електронни трансакции на вътрешния пазар, съдържащ информацията, съобщена от държавите-членки съгласно член 4, параграфи 1 и 2 Решение за изпълнение (ЕС) № 2015/1505 на Комисията. -Европейската комисия поддържа този уебсайт като инструмент за оперативна съвместимост, чиято цел е да улесни използването на национални доверителни списъци. Наша цел е да поддържаме актуалността и точността на тази информация. Ако ни съобщите за допуснатигрешки, ще се постараем да ги коригираме. Въпреки това Комисията не поема никаква отговорност по отношение на съдържанието на националните доверителни списъци, за което отговорност носят изцяло държавите-членки. -Наша цел е да сведем до минимум проблемите, причинени от технически грешки. Въпреки това някои данни или информация на нашия сайт може да са създадени или структурирани във файлове или формати, податливи на грешки, и не можем да гарантираме, че нашитеуслуги няма да бъдат прекъснати или засегнати по друг начин от подобни проблеми. Европейската комисия не поема отговорност по отношение на такива проблеми, появили се в резултат от използването на този сайт или на други външни сайтове, свързани с него. -Настоящият отказ от отговорност няма за цел да ограничава отговорността на Европейската комисия в разрез с изискванията, заложени в приложимото национално законодателство, нито да я освобождава от отговорност в области, в които това не е възможно съгласно товазаконодателство. - De conformidad con el artículo 4, apartado 3, Decisión de Ejecución (UE) 2015/1505 de la Comisión, de 8 de septiembre de 2015, por la que se establecen las especificaciones técnicas y los formatos relacionados con las listas de confianza de conformidad con el artículo 22, apartado 5, del Reglamento (UE) n.° 910/2014 del Parlamento Europeo y del Consejo, relativo a la identificación electrónica y los servicios de confianza para las transacciones electrónicas en el mercado interior, la presente lista contiene la información notificada por los Estados miembros en virtud del artículo 4, apartados 1 y 2, Decisión de Ejecución (UE) 2015/1505 de la Comisión. -Con el presente sitio Internet la Comisión Europea quiere ofrecer una herramienta de interoperabilidad que facilite el uso práctico de las listas de confianza nacionales. Nuestro objetivo es mantener esta información actualizada y precisa. Trataremos de corregir los errores que se nos señalen. No obstante, la Comisión no asume responsabilidad alguna en relación con el contenido de las listas de confianza nacionales, que son de la exclusiva incumbencia de los Estados miembros. -Queremos reducir al mínimo los problemas ocasionados por errores de carácter técnico. No obstante, algunos datos o informaciones de nuestro sitio pueden haber sido creados u organizados en archivos o formatos no exentos de errores, y no podemos garantizar que nuestro servicio no se vea interrumpido o afectado de alguna otra manera. La Comisión no asume responsabilidad alguna por los problemas que puedan surgir al utilizar este sitio o sitios externos con enlaces al mismo. -La presente cláusula de exención de responsabilidad no tiene por objeto limitar la responsabilidad de la Comisión de forma contraria a lo dispuesto por las normativas nacionales aplicables ni excluir su responsabilidad en los casos en los que, en virtud de dichas normativas, no pueda excluirse. - V souladu s čl. 4 odst. 3 rozhodnutí Komise (EU) 2015/1505 ze dne 8. září 2015, kterým se stanoví technické specifikace a formáty důvěryhodných seznamů podle čl. 22 odst. 5 nařízení Evropského parlamentu a Rady (EU) č. 910/2014 o elektronické identifikaci a službách vytvářejících důvěru pro elektronické transakce na vnitřním trhu, tento seznam obsahuje informace oznámené členskými státy podle čl. 4 odst. 1 a 2 rozhodnutí Komise (EU) 2015/1505. -Tyto internetové stránky spravuje Evropská komise s cílem usnadnit praktické využívání důvěryhodných seznamů z jednotlivých členských států. Snažíme se poskytovat aktualizované a přesné informace. Snažíme se rovněž opravovat všechny chyby, na něž nás upozorníte. Komise však vylučuje jakoukoli odpovědnost za obsah důvěryhodných seznamů, neboť tuto odpovědnost nesou výhradně členské státy. -Snažíme se vyvarovat poruch způsobených technickými chybami. Některé údaje či informace na našich internetových stránkách však mohly být vytvořeny či strukturovány do souborů či formátů, které nejsou bezchybné, a proto nemůžeme zaručit, že naše služby nebudou v důsledku takových problémů přerušeny či jinak ovlivněny. Evropská komise odmítá jakoukoli odpovědnost za problémy, které nastanou v důsledku používání těchto stránek nebo externích stránek, na něž tyto stránky odkazují. -Záměrem tohoto prohlášení není omezit odpovědnost Evropské komise v případě porušení platných vnitrostátních právních předpisů ani vyloučit její odpovědnost v záležitostech, ve kterých ji podle těchto předpisů vyloučit nelze. - I overensstemmelse med artikel 4, stk. 3, i Kommissionens gennemførelsesforordning (EU) 2015/1505 af 8. september 2015 om fastlæggelse af tekniske specifikationer og formater for positivlister i henhold til artikel 22, stk. 5, i Europa-Parlamentets og Rådets forordning (EU) nr. 910/2014 om elektronisk identifikation og tillidstjenester til brug for elektroniske transaktioner på det indre marked, indeholder denne liste de oplysninger, som medlemslandene har afgivet i henhold til artikel 4, stk. 1 og 2 i Kommissionens gennemførelsesforordning (EU) 2015/1505. -Kommissionen har her på webstedet samlet information om de nationale positivlister, så det er lettere at anvende dem i praksis. Vi tilstræber, at oplysningerne er korrekte og ajourførte. Hvis vi bliver opmærksomme på fejl, søger vi at rette dem. Kommissionen påtager sig imidlertid intet ansvar for indholdet i de nationale positivlister. Ansvaret påhviler udelukkende medlemslandene. -Vi tilstræber så vidt muligt at mindske forstyrrelser forårsaget af tekniske problemer. Dog kan visse data eller andre oplysninger på webstedet være blevet struktureret i filer eller formater, som ikke er fejlfrie, og vi kan ikke garantere, at vores service ikke afbrydes eller i øvrigt ikke påvirkes af den slags problemer. Kommissionen påtager sig intet ansvar for sådanne ulemper, der måtte opstå som følge af brugen af dette websted eller andre tilknyttede eksterne websteder. -Hensigten med denne erklæring om ansvarsfraskrivelse er hverken at begrænse Kommissionens ansvar på en måde, der strider med eventuelle krav ifølge gældende national ret, eller at udelukke Europa-Kommissionens ansvar i tilfælde, hvor ansvar ikke kan udelukkes ifølge national ret. - Diese Liste enthält die von den Mitgliedstaaten übermittelten Angaben und steht damit im Einklang mit Artikel 4 Absatz 3 des Durchführungsbeschlusses (EU) 2015/1505 der Kommission vom 8. September 2015 über technische Spezifikationen und Formate in Bezug auf Vertrauenslisten gemäß Artikel 22 Absatz 5 der Verordnung (EU) Nr. 910/2014 des Europäischen Parlaments und des Rates über elektronische Identifizierung und Vertrauensdienste für elektronische Transaktionen im Binnenmarkt in Übereinstimmung mit Artikel 4 Absätze 1 und 2 den Durchführungsbeschluss (EU) 2015/1505 der Kommission. -Diese Website der Europäischen Kommission ist als Schnittstelle gedacht, die die Verwendung nationaler vertrauenswürdiger Listen in der Praxis vereinfachen soll. Wir sind bestrebt, die einschlägigen Informationen inhaltlich richtig und rechtzeitig bereitzustellen. Wir bemühen uns, Irrtümer zu berichtigen, die uns zur Kenntnis gebracht werden. Die Kommission übernimmt jedoch keine Verantwortung oder Haftung für den Inhalt der nationalen vertrauenswürdigen Listen, für die ausschließlich die Mitgliedstaaten zuständig sind. -Wir arbeiten darauf hin, technisch bedingte Störungen auf ein Mindestmaß zu reduzieren. Dennoch kann es vorkommen, dass Daten oder Informationen auf unserer Website in fehlerhaften Dateien oder Formaten vorliegen. Wir können also nicht garantieren, dass der Arbeitsablauf durch derartige Probleme nicht gestört oder anderweitig beeinträchtigt wird. Die Europäische Kommission übernimmt für derartige Störungen beim Besuch dieser Website oder damit verbundener externer Sites keine Verantwortung. -Mit der vorliegenden Haftungsausschlussklausel soll die Haftung der Europäischen Kommission bei Nichteinhaltung der einschlägigen nationalen Rechtsvorschriften weder eingeschränkt noch in Fällen ausgeschlossen werden, in denen ein Ausschluss nach diesen Rechtsvorschriften nicht möglich ist. - Vastavalt Komisjoni 8. septembri 2015. aasta rakendusotsus (EL) 2015/1505, millega kehtestatakse usaldusnimekirjade tehnilised kirjeldused ja vormingud vastavalt Euroopa Parlamendi ja nõukogu määruse (EL) nr 910/2014 (e-identimise ja e-tehingute jaoks vajalike usaldusteenuste kohta siseturul) artikli 22 lõikele 5 artikli 4 lõikele 3, sisaldab käesolev loetelu liikmesriikide vastavalt komisjoni rakendusotsuse (EL) 2015/1505 artikli 4 lõikele 1 ja artikli 4 lõikele 2 esitatud teavet. -Euroopa Komisjon haldab asjaomast veebisaiti koostalitlusvõime vahendina, mis hõlbustab liikmesriikide usaldusnimekirjade praktilist kasutamist. Eesmärk on pakkuda õigeaegset ja täpset teavet. Märgatud vigu püüame parandada. Samas ei võta komisjon endale vastutust ega mingeid kohustusi liikmesriikide usaldusnimekirjade sisu suhtes, mille eest vastutavad üksnes liikmesriigid ise. -Meie eesmärk on vähendada tehniliste vigade tõttu tekkinud häireid. Osa veebisaidil olevatest andmetest või teabest võib aga olla loodud või paigutatud vigastesse failidesse või vormingutesse ning seega ei saa me tagada, et sellised probleemid meie teenust ei häiri või muul moel ei mõjuta. Euroopa Komisjon ei võta endale vastutust seoses kõnealuste probleemidega, mis tulenevad käesoleva veebisaidi või seonduvate välissaitide kasutamisest. -Käesoleva vastutamatusesätte eesmärk ei ole Euroopa Komisjoni vastutuse piiramine, mis oleks vastuolus kohaldatavas liikmesriigi õigusaktis sätestatud nõuetega ega komisjoni vastutuse kõrvaldamine küsimustes, mida ei tohi asjaomase õigusakti alusel kõrvale jätta. - Σύμφωνα με το άρθρο 4 παράγραφος 3 της εκτελεστικής απόφασης (ΕΕ) 2015/1505 της Επιτροπής, της 8ης Σεπτεμβρίου 2015, περί καθορισμού των τεχνικών προδιαγραφών και των μορφότυπων των καταλόγων εμπίστευσης σύμφωνα με το άρθρο 22 παράγραφος 5 του κανονισμού (ΕΕ) αριθ. 910/2014 του Ευρωπαϊκού Κοινοβουλίου και του Συμβουλίου σχετικά με την ηλεκτρονική ταυτοποίηση και τις υπηρεσίες εμπιστοσύνης για τις ηλεκτρονικές συναλλαγές στην εσωτερική αγορά, ο παρών κατάλογος περιέχει τις πληροφορίες που γνωστοποιούν τα κράτη μέλη σύμφωνα με το άρθρο 4 παράγραφοι 1 και 2 της απόφασης 2009/767/EΚ της Επιτροπής. -Ο δικτυακός αυτός τόπος της Ευρωπαϊκής Επιτροπής είναι ένα διαλειτουργικό εργαλείο σχεδιασμένο για να διευκολύνει τη χρήση των εθνικών καταλόγων εμπίστευσης.. Στόχος μας είναι να παρέχουμε ακριβή και επικαιροποιημένα στοιχεία. Αν επισημανθούν σφάλματα θα καταβληθεί κάθε προσπάθεια για τη διόρθωσή τους.Ωστόσο, η Επιτροπή δεν φέρει καμία ευθύνη όσον αφορά το περιεχόμενο των εθνικών καταλόγων εμπίστευσης, για τους οποίους την αποκλειστική ευθύνη φέρουν τα κράτη μέλη. -Καταβάλλουμε κάθε προσπάθεια ώστε να ελαχιστοποιήσουμε τις διακοπές που προκαλούνται από τεχνικά προβλήματα. Ωστόσο, ορισμένα δεδομένα ή πληροφορίες που περιέχει ο δικτυακός τόπος μπορεί να έχουν δημιουργηθεί ή οργανωθεί σε αρχεία ή μορφότυπους που περιέχουν σφάλματα και γι΄αυτό δεν μπορούμε να εγγυηθούμε ότι η υπηρεσία μας δεν θα διακοπεί, ή δεν θα επηρεαστεί με άλλο τρόπο, από τέτοια προβλήματα. Η Επιτροπή δεν φέρει καμιά ευθύνη όσον αφορά τέτοια προβλήματα που ανακύπτουν κατά τη χρήση αυτού του δικτυακού τόπου, ή οποιουδήποτε άλλου συνδεδεμένου δικτυακού τόπου. -Η παρούσα δήλωση αποποίησης ευθύνης δεν έχει σκοπό να περιορίσει την ευθύνη της Ευρωπαϊκής Επιτροπής κατά τρόπο που αντίκειται στις απαιτήσεις της ισχύουσας εθνικής νομοθεσίας ούτε να αποκλείσει την ευθύνη της για ζητήματα για τα οποία δεν μπορεί να αποκλειστεί δυνάμει της εν λόγω νομοθεσίας. - Conformément à l'article 4, paragraphe 3 de la Décision d'exécution (UE) 2015/1505 de la Commission du 8 septembre 2015 établissant les spécifications techniques et les formats relatifs aux listes de confiance visées à l'article 22, paragraphe 5, du règlement (UE) n° 910/2014 du Parlement européen et du Conseil sur l'identification électronique et les services de confiance pour les transactions électroniques au sein du marché intérieur, la présente liste contient les informations notifiées par les États membres conformément à l'article 4, paragraphe 1 et à l'article 4 paragraphe 2, de la décision d'exécution (UE) 2015/1505 de la Commission. -Le présent site de la Commission européenne constitue un outil d'interopérabilité destiné à faciliter l'utilisation des listes de confiance nationales. Notre objectif est de diffuser des informations exactes et à jour. Nous nous efforcerons de corriger les erreurs qui nous seront signalées. Toutefois, la Commission n'assume pas la responsabilité du contenu des listes de confiance nationales, qui incombe exclusivement aux États membres. -Nous souhaitons limiter autant que possible les inconvénients occasionnés par des erreurs techniques. Cependant, certaines données ou informations présentes sur notre site peuvent avoir été créées ou structurées dans des fichiers ou des formats qui ne sont pas exempts d'erreurs. Il nous est donc impossible de garantir que notre service ne sera pas interrompu ou autrement affecté par de tels problèmes. La Commission décline toute responsabilité quant aux éventuels problèmes de ce type, résultant d'une utilisation du présent site ou de tout autre site extérieur auquel il renvoie. -La présente clause de non-responsabilité n'a pas pour but de limiter la responsabilité de la Commission de manière contraire aux dispositions prévues dans les législations nationales applicables ou de dégager sa responsabilité dans des cas où elle ne peut l'être en vertu desdites législations. - Conformemente all'articolo 4, paragrafo 3, della decisione di esecuzione (UE) 2015/1505 della Commissione dell’8 settembre 2015, che stabilisce le specifiche tecniche e i formati relativi agli elenchi di fiducia di cui all’articolo 22, paragrafo 5, del regolamento (UE) n. 910/2014 del Parlamento europeo e del Consiglio in materia di identificazione elettronica e servizi fiduciari per le transazioni elettroniche nel mercato interno , la presente lista contiene le informazioni notificate dagli Stati membri a norma dell'articolo 4, paragrafi 1 e 2, della decisione di esecuzione (UE) 2015/1505 della Commissione. -Il presente sito della Commissione europea assicura l'interoperabilità necessaria per facilitare l'uso pratico degli elenchi di fiducia nazionali. L'obiettivo perseguito è quello di fornire un'informazione aggiornata e precisa. Qualora dovessero essere segnalati degli errori, si provvederà a correggerli. La Commissione non si assume alcuna responsabilità per quanto riguarda il contenuto degli elenchi di fiducia nazionali, che è di competenza esclusiva degli Stati membri. -È nostra cura ridurre al minimo le disfunzioni imputabili a problemi tecnici. Parte dei dati o delle informazioni presenti nel sito potrebbero tuttavia essere stati inseriti o strutturati in archivi o formati non esenti da errori. Non possiamo pertanto garantire che il servizio non subisca interruzioni o che non sia in altro modo influenzato da tali problemi. La Commissione non si assume alcuna responsabilità per gli eventuali problemi derivanti dall'utilizzazione del presente sito o di eventuali siti esterni ad esso collegati. -La presente clausola di esclusione della responsabilità non ha lo scopo di limitare la responsabilità della Commissione in violazione di disposizioni della legge nazionale applicabile, né di escluderla nei casi in cui non può essere esclusa in forza di detta legge. - Šajā sarakstā ir iekļauta informācija, kuru dalībvalstis Komisijai ir paziņojušas saskaņā ar 4. panta 3. punktu Komisijas 2015. gada 8. septembra Īstenošanas lēmums (ES) 2015/1505, kurā saskaņā ar Eiropas Parlamenta un Padomes Regulas (ES) Nr. 910/2014 par elektronisko identifikāciju un uzticamības pakalpojumiem elektronisko darījumu veikšanai iekšējā tirgū 22. panta 5. punktu izklāstītas tehniskās specifikācijas un formāti, kas attiecas uz uzticamības sarakstiem. Šis saraksts publicēts atbilstīgi Komisijas Īstenošanas lēmuma (ES) 2015/1505 4. panta 1. un 2. punktu. -Eiropas Komisija uztur šo tīmekļa vietni, lai sekmētu dalībvalstu uzticamo sarakstu praktisku un savstarpēju izmantošanu. Mēs darām visu, lai nodrošinātu, ka šī informācija ir sniegta laicīgi un ir pareiza. Centīsimies labot norādītās kļūdas. Tomēr Komisija neuzņemas nekādu atbildību vai saistības attiecībā uz dalībvalstu uzticamajos sarakstos sniegto informāciju, jo par tiem atbild vienīgi dalībvalstis. -Mēs darām visu, lai līdz minimumam samazinātu traucējumus, ko rada tehniskas kļūmes. Tomēr atsevišķos gadījumos dati vai informācija, kas iekļauta mūsu vietnē, ir sagatavota vai organizēta datnēs vai formātos, kas nefunkcionē nevainojami, un mēs nevaram garantēt, ka šādas problēmas nepārtrauks vai citādi neietekmēs mūsu pakalpojumus. Eiropas Komisija neuzņemas nekādu atbildību par problēmām, kas rodas, izmantojot šo vietni vai kādu citu ārēju vietni, uz kuru esam snieguši hipersaiti. -Šī atruna neierobežo Eiropas Komisijas atbildību tad, ja nav ievērotas spēkā esošo valsts tiesību aktu prasības, un neierobežo tās atbildību gadījumos, kad saskaņā ar tiesību aktiem tai atbildība ir jāuzņemas. - Remiantis 2015 m. rugsėjo 8 d. Komisijos įgyvendinimo sprendimas (ES) 2015/1505, kuriuo pagal Europos Parlamento ir Tarybos reglamento (ES) Nr. 910/2014 dėl elektroninės atpažinties ir elektroninių operacijų patikimumo užtikrinimo paslaugų vidaus rinkoje 22 straipsnio 5 dalį nustatomos patikimų sąrašų techninės specifikacijos ir formatai, 4 straipsnio 3 dalimi, šiame sąraše pateikiama informacija, kurią valstybės narės perdavė pagal Komisijos įgyvendinimo sprendimo (ES) 2015/1505 4 straipsnio 1 ir 2. -Ši Europos Komisijos administruojama interneto svetainė – sąveiki priemonė, skirta praktiniam naudojimuisi valstybių narių patikimais sąrašais palengvinti. Siekiame laiku teikti tikslią informaciją ir ištaisyti visas pastebėtas klaidas. Tačiau Komisija neprisiima atsakomybės ar teisinių įsipareigojimų dėl valstybių narių patikimų sąrašų turinio. Už jį atsakingos tik valstybės narės. -Siekiame, kad būtų kuo mažiau nesklandumų dėl techninių klaidų. Tačiau tam tikri mūsų interneto svetainėje skelbiami duomenys gali būti sukurti ar susisteminti tokiose rinkmenose arba tokiais formatais, kuriuose pasitaiko klaidų, todėl negalime užtikrinti, kad tokios problemos nesutrikdys mūsų darbo ar jo kaip nors kitaip nepaveiks. Europos Komisija neprisiima atsakomybės už tokio pobūdžio problemas, kylančias naudojantis šia interneto svetaine arba kitomis su ja susietomis išorės svetainėmis. -Šiuo atsakomybės apribojimu nesiekiama sumažinti Europos Komisijos teisinių įsipareigojimų nepažeisti jokių taikytinų nacionalinės teisės reikalavimų ar neprisiimti teisinių įsipareigojimų už tai, už ką pagal tą teisę nuo atsakomybės neatleidžiama. - A Bizottság 2015. szeptember 8-i (EU) 2015/1505 végrehajtási határozata a belső piacon történő elektronikus tranzakciókhoz kapcsolódó elektronikus azonosításról és bizalmi szolgáltatásokról szóló 910/2014/EU európai parlamenti és tanácsi rendelet 22. cikkének (5) bekezdése szerinti bizalmi listákhoz kapcsolódó technikai specifikációk és formátumok meghatározásáról bizottsági határozat 4. cikkének (3) bekezdése értelmében a jelen lista azokat az információkat tartalmazza, amelyeket a tagállamok a (EU) 2015/1505 bizottsági végrehajtási határozat 4. cikkének (1) és (2) bekezdésben értelmében jelentettek be. -Az Európai Bizottság e weblapot a kölcsönös átjárhatóság elősegítésére tartja fönn, abból a célból, hogy megkönnyítse a megbízható szolgáltatók listájának használatát. Célunk az, hogy ezek az információk naprakészek és pontosak legyenek. Amennyiben arról értesülünk, hogy a webhelyen hibás információk szerepelnek, azokat igyekszünk kijavítani. A Bizottság semmilyen felelősséget sem vállal a nemzeti megbízható szolgáltatók listájának tartalmáért, mert azért kizárólag a tagállamok felelősek. -Arra törekszünk, hogy az esetleges technikai hibák a lehető legkisebb mértékben okozzanak fennakadásokat a portál működésében. Előfordulhat ugyanakkor, hogy a portál oldalain található adatok vagy információk olyan fájlokban vagy formátumokban állnak rendelkezésre, amelyek nem mentesek a hibáktól; ilyen esetekben nem tudjuk garantálni, hogy ezek a problémák nem okoznak fennakadásokat a webhely használata során. Az Európai Bizottság nem vállal felelősséget a honlap (vagy a belinkelt külső honlapok) használatából fakadó problémákért. -E jogi nyilatkozat nem korlátozza az Európai Bizottságnak az alkalmazandó közösségi jogban lefektetett követelményekből fakadó felelősségét, és nem zárja ki a Bizottság felelősségét olyan ügyekben, amelyekért az említett jog értelmében felelősségre vonható. - F'konformità mal-Art. 4(3) tad-Deċiżjoni ta' Implimentazzjoni tal-Kummissjoni (UE) 2015/1505 (4) tat-8 ta’ Settembru 2015 li tistabbilixxi l-ispeċifikazzjonijiet u l-formati tekniċi marbutin mal-listi ta’ fiduċja skont l-Artikolu 22(5) tar-Regolament (UE) Nru 910/2014 tal-Parlament Ewropew u tal-Kunsill dwar l-identifikazzjoni elettronika u s-servizzi fiduċjarji għal tranżazzjonijiet elettroniċi fis-suq intern, dan l-elenku fih l-informazzjoni notifikata mill-Istati Membri skont l-Artikoli 4.1 u 4.2 tad-Deċiżjoni ta’ Implimentazzjoni tal-Kummissjoni (UE) 2015/1505. -Il-Kummissjoni Ewropea żżomm dan is-sit bħala strument ta' interoperabilità ddisinnjat biex jiffaċilita l-użu prattiku tal-Listi ta' Fiduċja nazzjonali. L-għan tagħna hu li nżommu din l-informazzjoni aġġornata u eżatta. Jekk tiġbdulna l-attenzjoni li hemm żbalji, aħna nippruvaw nikkoreġuhom. Madanakollu l-Kummissjoni ma taċċetta l-ebda responsabbiltà fir-rigward tal-kontenut tal-Listi ta' Fiduċja nazzjonali li taqa' esklussivament fuq l-Istati Membri. -Huwa l-għan tagħna li nnaqqsu t-tfixkil ikkawżat mill-iżbalji tekniċi. Madanakollu, xi dejta jew informazzjoni fuq is-sit tagħna setgħet inħolqot jew ġiet strutturata f’fajls jew formati li mhumiex ħielsa mill-iżbalji u ma nistgħux niggarantixxu li s-servizz tagħna ma jiġix interrott jew b’xi mod effettwat minn problemi bħal dawn. Il-Kummissjoni ma tieħu l-ebda responsabbiltà għal dawn il-problemi mġarrba bħala riżultat tal-użu ta' dan is-sit jew kwalunkwe siti esterni relatati. -Din ir-rinunzja mhijiex maħsuba biex tillimita r-responsabbiltà tal-Kummissjoni fil-kontravenzjoni ta' kwalunkwe rekwiżit stipulat fil-liġi applikabbli tal-Komunità, l-anqas biex tneħħi r-responsabbiltà għal kwistjonijiet li jistgħu ma jkunux esklużi taħt dik il-liġi. - Overeenkomstig artikel 4, lid 3, van Uitvoeringsbesluit (EU) 2015/1505 van de Commissie van 8 september 2015 tot vaststelling van de technische specificaties en formaten van vertrouwenslijsten overeenkomstig artikel 22, lid 5, van Verordening (EU) nr. 910/2014 van het Europees Parlement en de Raad betreffende elektronische identificatie en vertrouwensdiensten voor elektronische transacties in de interne markt, bevat deze lijst de door de lidstaten meegedeelde gegevens op grond van artikel 4, leden 1 en 2, van Uitvoeringsbesluit (EU) 2015/1505 van de Commissie. -De Europese Commissie wil met deze website het gebruik van de vertrouwenslijsten vergemakkelijken. Ons doel is up-to-date en nauwkeurige informatie aan te bieden. Gesignaleerde fouten worden zo snel mogelijk gecorrigeerd. De Commissie aanvaardt echter geen enkele verantwoordelijkheid of aansprakelijkheid met betrekking tot de informatie op de vertrouwenslijsten. De verantwoordelijkheid hiervoor ligt uitsluitend bij de EU-landen. -Wij proberen onderbrekingen door technische storingen zoveel mogelijk te beperken. Sommige gegevens of informatie op onze site kan zijn aangemaakt of omgezet in bestanden of formaten die niet foutloos zijn. Wij kunnen niet uitsluiten dat onze dienstverlening door dergelijke problemen wordt verstoord. De Commissie aanvaardt geen aansprakelijkheid voor die problemen die zich als gevolg van het gebruik van deze site of van andere daarmee verbonden externe sites mochten voordoen. -Met deze disclaimer wordt niet beoogd de aansprakelijkheid van de Commissie te beperken in strijd met de in de toepasselijke EU-wetgeving vervatte vereisten, noch haar aansprakelijkheid uit te sluiten voor aangelegenheden die uit hoofde van die wetgeving niet mogen worden uitgesloten. - Zgodnie z art. 4 ust. 3 decyzji wykonawczej Komisji (UE) 2015/1505 z dnia 8 września 2015 r. ustanawiająca specyfikacje techniczne i formaty dotyczące zaufanych list zgodnie z art. 22 ust. 5 rozporządzenia Parlamentu Europejskiego i Rady (UE) nr 910/2014 w sprawie identyfikacji elektronicznej i usług zaufania w odniesieniu do transakcji elektronicznych na rynku wewnętrznym, wykaz ten zawiera informacje przekazane przez państwa członkowskie zgodnie z artykułami 4.1 i 4.2 decyzji wykonawczej Komisji (UE) 2015/1505. -Ta strona internetowa Komisji Europejskiej ma ułatwić korzystanie z krajowych zaufanych list. Naszym celem jest dostarczanie aktualnych i ścisłych informacji. Jeśli zostaniemy powiadomieni o błędach, dołożymy wszelkich starań, aby je skorygować. Komisja nie ponosi jednak żadnej odpowiedzialności za treść krajowych zaufanych list, za którą odpowiadają wyłącznie państwa członkowskie. -Naszym celem jest ograniczenie do minimum zakłóceń wynikających z błędów technicznych. Jednak niektóre z zamieszczonych w tym serwisie danych lub informacji mogły być utworzone lub zamieszczone w plikach lub formatach, które nie są wolne od błędów, w związku z czym nie możemy zagwarantować, że problemy takie nie spowodują przerw w dostępie do serwisu lub innych zakłóceń w jego funkcjonowaniu. Komisja Europejska nie bierze odpowiedzialności w związku z tego rodzaju problemami będącymi następstwem korzystania z tego serwisu lub jakichkolwiek serwisów zewnętrznych, do których odsyła niniejszy serwis. -Niniejsze zastrzeżenie nie ma na celu ograniczenia odpowiedzialności Komisji Europejskiej w przypadku naruszenia jakichkolwiek wymagań określonych w stosownych przepisach prawa krajowego ani wyłączenia jej odpowiedzialności za kwestie, które na gruncie tego prawa nie podlegają wyłączeniu. - Em conformidade com o n.º 3 do artigo 4.° da Decisão de Execução (UE) 2015/1505 da Comissão, de 8 de setembro de 2015, que estabelece as especificações técnicas e os formatos relativos às listas de confiança, nos termos do artigo 22.º, n.º 5, do Regulamento (UE) n.º 910/2014 do Parlamento Europeu e do Conselho relativo à identificação eletrónica e aos serviços de confiança para as transações eletrónicas no mercado interno, a presente lista contém as informações notificadas pelos Estados-Membros ao abrigo do n.º 1 do artigo 4.° e n.º 2 do artigo 4.° da Decisão de Execução (UE) 2015/1505 da Comissão. -Este sítio Web da Comissão Europeia assegura a interoperabilidade necessária para facilitar uma utilização eficaz das listas aprovadas e tem por objectivo fornecer informações exactas e actualizadas. Procuraremos corrigir todos os erros que nos forem comunicados. Contudo, a Comissão declina toda e qualquer responsabilidade quanto ao conteúdo das listas aprovadas nacionais, que incumbe exclusivamente aos Estados-Membros. -É nosso objectivo reduzir ao mínimo os inconvenientes causados por erros técnicos. Contudo, determinados dados constantes do nosso sítio podem ter sido criados ou estruturados em ficheiros ou formatos não isentos de erros, pelo que não podemos garantir um serviço sem interrupções ou perturbações. A Comissão declina qualquer responsabilidade por eventuais problemas que surjam na sequência da consulta deste sítio ou de quaisquer sítios externos a que as ligações dêem acesso. -A presente declaração de exoneração de responsabilidade não pretende limitar a responsabilidade da Comissão Europeia de uma forma que contrarie o disposto na legislação nacional aplicável, nem excluir a sua responsabilidade nos casos em que tal não é permitido por essa legislação. - În conformitate cu articolul 4 alineatul (3) din Decizia de punere în aplicare (UE) 2015/1505 a Comisiei din 14 octombrie 2013 de modificare a Deciziei 2009/767/CE în ceea ce privește crearea, menținerea și publicarea listelor sigure de prestatori de servicii de certificare supravegheați/acreditați de către statele membre, prezenta listă conține informațiile notificate de statele membre în conformitate cu articolul 4 alineatele (1) și (2) din Decizia de punere în aplicare (UE) 2015/1505 a Comisiei. -Comisia Europeană utilizează acest site ca instrument de facilitare a utilizării Listelor naționale sigure, prin sporirea interoperabilității. Scopul nostru este ca aceste informații să fie actualizate și exacte. În cazul în care ni se vor semnala erori, vom încerca să le corectăm. Totuși, Comisia nu îșiasumă niciun fel de responsabilitate cu privire la conținutul Listelor naționale sigure, care intră, integral, în sarcina statelor membre. -De asemenea, ne propunem să reducem consecințele negative cauzate de erori tehnice. Cu toate acestea, este posibil ca unele date sau informații de pe site-ul nostru să fi fost create sau structurate în fișiere sau formate care pot prezenta erori. Prin urmare, nu putem garanta că serviciile noastrenu vor fi întrerupte sau afectate de asemenea probleme. Comisia Europeană nu își asumă nicio responsabilitate cu privire la eventuale probleme survenite ca urmare a utilizării acestui site sau a oricăror alte site-uri externe la care face trimitere. -Această denegare de responsabilitate nu este destinată să limiteze răspunderea Comisiei Europene într-un mod care contravine reglementărilor prevăzute de legislația internă aplicabilă și nu exclude răspunderea sa în cazuri care, în conformitate cu legislația respectivă, aceasta nu poate fiexclusă. - V súlade s článkom 4 ods. 3 vykonávacieho rozhodnutia Komisie (EÚ) 2015/1505 z 8. septembra 2015, ktorým sa ustanovujú technické špecifikácie a formáty týkajúce sa dôveryhodných zoznamov podľa článku 22 ods. 5 nariadenia Európskeho parlamentu a Rady (EÚ) č. 910/2014 o elektronickej identifikácii a dôveryhodných službách pre elektronické transakcie na vnútornom trhu, tento zoznam obsahuje informácie oznámené členskými štátmi podľa článkov 4 ods. 1 a 2 vykonávacieho rozhodnutia Komisie (EÚ) 2015/1505. -Európska komisia spravuje tieto internetové stránky ako interoperabilný nástroj, ktorý slúži na uľahčenie praktického využitia zoznamov dôveryhodných informácií. Naším cieľom je poskytovať tieto informácie včas a správne. Ak budeme upozornení na chyby, pokúsime sa ich napraviť.Komisia však nepreberá žiadnu zodpovednosť, ani inak neručí za obsah zoznamov dôveryhodných informácií, ktoré poskytli členské štáty. -Je naším cieľom minimalizovať technické chyby. Niektoré informácie alebo údaje na tejto webovej lokalite však mohli byť vytvorené v chybných súboroch alebo formátoch, a preto nemožno zaručiť, že tieto problémy nespôsobia výpadok alebo inú poruchu našej webovej lokality. Komisia nenesie žiadnu zodpovednosť za podobné chyby, ktoré sa zistia pri používaní tejto lokality alebo pridružených externých lokalít. -Zámerom tohto vyhlásenia o odmietnutí zodpovednosti nie je obmedzenie zodpovednosti Európskej komisie v rozpore s požiadavkami ustanovenými v príslušných vnútroštátnych predpisoch ani vylúčenie jej zodpovednosti vo veciach, v ktorých ju podľa týchto predpisov nie je možné vylúčiť. - Seznam v skladu s členom 4(3) Izvedbenega sklepa Komisije (EU) 2015/1505 z dne 8. septembra 2015 o določitvi tehničnih specifikacij in formatov v zvezi z zanesljivimi seznami v skladu s členom 22(5) Uredbe (EU) št. 910/2014 Evropskega parlamenta in Sveta o elektronski identifikaciji in storitvah zaupanja za elektronske transakcije na notranjem trgu, vsebuje informacije, ki so jih v skladu s členom 4 (1) in (2) Izvedbenega sklepa Komisije (EU) 2015/1505 sporočile države članice. -Evropska komisija si prizadeva izboljšati praktično uporabo zanesljivih seznamov držav članic. Temu je namenjeno tudi to spletišče. Želimo zagotavljati pravočasne in točne informacije. Če nas boste opozorili na morebitne napake, jih bomo poskušali čimprej odpraviti. Komisija ne prevzema nikakršne zakonske ali druge odgovornosti glede vsebine nacionalnih zanesljivih seznamov, za katero so odgovorne izključno države članice. -Uporabnikom želimo omogočiti nemoteno uporabo s čim manj tehničnimi napakami. Vendar so lahko nekateri podatki in informacije na našem spletišču v datotekah ali obliki, ki niso popolnoma brez napak, zato ne moremo zagotoviti, da takšne težave ne bodo vplivale na zagotavljanje naših storitev. Komisija ne prevzema nobene odgovornosti v zvezi s težavami, ki so posledica uporabe tega spletišča ali povezanega zunanjega spletišča. -Izjava ne omejuje odgovornosti Evropske komisije pri kakršnem koli delovanju v nasprotju z veljavno nacionalno zakonodajo, niti ne izključuje odgovornosti za dejanja, ki jih v skladu s to zakonodajo ni mogoče izključiti. - Tämä luettelo sisältää komission täytäntöönpanopäätöksen (EU) 2015/1505 4 artiklan 3 kohdan mukaisesti tiedot, jotka EU-maat ovat toimittaneet komission täytäntöönpanopäätöksen (EU) 2015/1505 4 artiklan 1 ja 2 kohdan mukaisesti (Komission täytäntöönpanopäätös (EU) 2015/1505, annettu 8 päivänä syyskuuta 2015, luotettujen luetteloiden teknisten eritelmien ja muotoseikkojen vahvistamisesta sähköisestä tunnistamisesta ja sähköisiin transaktioihin liittyvistä luottamuspalveluista sisämarkkinoilla annetun Euroopan parlamentin ja neuvoston asetuksen (EU) N:o 910/2014 22 artiklan 5 kohdan mukaisesti). -Euroopan komissio ylläpitää tätä verkkosivustoa helpottaakseen kansallisten luotettavien luetteloiden käyttöä. Pyrimme pitämään tiedot ajantasaisina ja virheettöminä. Pyrimme korjaamaan tietoomme tulleet virheet. Komissio ei kuitenkaan voi olla vastuussa kansallisten luotettavien luetteloiden sisällöstä, joka on yksinomaan jäsenvaltioiden vastuulla. -Tavoitteenamme on minimoida teknisten häiriöiden aiheuttamat haitat. Jotkin tiedot sivustollamme on voitu luoda tai muotoilla sellaiseen muotoon tai sellaisiin tiedostoihin, jotka eivät ole virheettömiä, emmekä voi taata, ettei palvelumme keskeydy tai etteivät kyseiset ongelmat muutoin vaikuta siihen. Euroopan komissio ei vastaa ongelmista, jotka johtuvat tämän sivuston tai siihen linkitettyjen ulkopuolisten sivustojen käytöstä. -Tämän vastuuvapauslausekkeen tarkoituksena ei ole rajoittaa Euroopan komission vastuuta vastoin sovellettavan kansallisen lain vaatimuksia tai poistaa komission vastuuta seikoista, joiden osalta vastuuta ei sovellettavan kansallisen lain mukaan voida poistaa. - Av listan framgår var du kan hitta den information som EU-länderna har anmält, och som kommissionen måste tillhandahålla, enligt artikel 4.1, 4.2 och 4.3 i kommissionens genomförandebeslut (EU) 2015/1505 av den 8 september 2015 om fastställande av tekniska minimispecifikationer och format rörande förteckningar över betrodda tjänsteleverantörer i enlighet med artikel 22.5 i Europaparlamentets och rådets förordning (EU) nr 910/2014 om elektronisk identifiering och betrodda tjänster för elektroniska transaktioner på den inre marknaden. -Vi har samlat informationen på den här webbplatsen, så att du lättare ska kunna använda den i praktiken. Vi strävar efter att hålla informationen aktuell och korrekt. Om felaktigheter kommer till vår kännedom, försöker vi att rätta till dem. Vi frånsäger oss dock allt ansvar för de nationella förteckningarna. Medlemsländerna ansvarar helt och hållet själva för innehållet. -Vi strävar efter att så långt som möjligt undvika tekniska störningar. En del uppgifter eller information på vår sida kan dock ha skapats eller strukturerats i filer eller format som inte är felfria. Vi kan inte garantera att den service vi tillhandahåller kommer att vara fri från avbrott eller andra störningar som har att göra med sådana problem. Kommissionen frånsäger sig allt ansvar för problem som kan uppstå till följd av att denna webbplats eller någon av dess länkar har använts. -Denna ansvarsfriskrivning är inte avsedd att inskränka kommissionens ansvar i strid med tillämplig nationell lagstiftning eller att utesluta ansvar för kommissionen i de fall där friskrivning inte får ske enligt sådan lagstiftning. - U skladu s člankom 4. stavkom 3. Provedbene odluke Komisije (EU) 2015/1505 оd 8. rujna 2015. o utvrđivanju tehničkih specifikacija i formata koji se odnose na pouzdane popise u skladu s člankom 22. stavkom 5. Uredbe (EU) br. 910/2014 Europskog parlamenta i Vijeća o elektroničkoj identifikaciji i uslugama povjerenja za elektroničke transakcije na unutarnjem tržištu, trenutačni popis sadržava informacije o kojima su države članice izvijestile u skladu s člankom 4. stavkom 1. i člankom 4. stavkom 2. Provedbene odluke Komisije (EU) 2015/1505. -Europska Komisija održava ovo web-mjesto kao sredstvo za postizanje interoperabilnosti koje je napravljeno kako bi olakšalo praktičnu primjenu nacionalnih pouzdanih popisa. Naš je cilj ove informacije održavati pravodobnim i točnim. Ukaže li nam se na pogreške, pokušat ćemo ih otkloniti. No, Komisija ne preuzima nikakvu odgovornost za sadržaj nacionalnih pouzdanih popisa, jer su za njega odgovorne isključivo države članice. Cilj nam je smetnje uzrokovane tehničkim pogreškama svesti na minimum. Međutim, postoji mogućnost da su neki podaci i informacije na našim stranicama izrađeni ili strukturirani u datotekama ili formatima koji nisu bez pogrešaka te stoga ne možemo jamčiti da će se naše usluge odvijati bez prekida ili da takvi problemi neće na neki drugi način utjecati na njih. Europska Komisija ne preuzima nikakvu odgovornost u vezi s problemima koji nastanu zbog uporabe ovih stranica ili bilo kojih povezanih vanjskih stranica. Ovom se izjavom o ograničenju odgovornosti ne ograničava odgovornost Europske Komisije u slučaju kršenja uvjeta propisanih primjenjivim nacionalnim pravom niti se isključuje njezina odgovornost u slučajevima u kojima u skladu s tim pravom to nije moguće. - - 65535 - - - - - - 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 - - - - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl-mp.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUlistofthelists - - - EU - - - application/vnd.etsi.tsl+xml - - - - European Commission - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUlistofthelists - - - - - - - - - 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 - - - - https://www.signatur.rtr.at/currenttl.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - AT - - - application/vnd.etsi.tsl+xml - - - - Rundfunk und Telekom Regulierungs-GmbH - Rundfunk und Telekom Regulierungs-GmbH - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/AT - - - - - - - - - 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 - - - - https://tsl.belgium.be/tsl-be.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - BE - - - application/vnd.etsi.tsl+xml - - - - FPS Economy, SMEs, Self-employed and Energy - Quality and Safety - SPF Economie, PME, Classes moyennes et Energie - Qualité et Sécurité - FOD Economie, KMO, Middenstand en Energie - Kwaliteit en Veiligheid - FÖD Wirtschaft, KMU, Mittelstand und Energie - Qualität und Sicherheit - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/BE - - - - - - - - - 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 - - - - http://crc.bg/files/_bg/TSL-CRC-BG-signed.pdf - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - BG - - - application/pdf - - - - Communications Regulation Commission - Комисия за регулиране на съобщенията - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/BG - - - - - - - - - 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 - - - - http://crc.bg/files/_bg/TSL-CRC-BG-signed.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - BG - - - application/vnd.etsi.tsl+xml - - - - Communications Regulation Commission - Комисия за регулиране на съобщенията - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/BG - - - - - - - - - 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 - - - - http://www.mcw.gov.cy/mcw/dec/dec.nsf/all/B28C11BBFDBAC045C2257E0D002937E9/$file/TSL-CY-sign.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - CY - - - application/vnd.etsi.tsl+xml - - - - Department of Electronic Communications - Τμήμα Ηλεκτρονικών Επικοινωνιών - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/CY - - - - - - - - - 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 - - - - https://tsl.gov.cz/publ/TSL_CZ.pdf - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - CZ - - - application/pdf - - - - Ministry of the Interior of the Czech Republic - Ministerstvo vnitra České republiky - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/CZ - - - - - - - - - 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 - - - - https://tsl.gov.cz/publ/TSL_CZ.xtsl - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - CZ - - - application/vnd.etsi.tsl+xml - - - - Ministry of the Interior of the Czech Republic - Ministerstvo vnitra České republiky - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/CZ - - - - - - - - - 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 - - - - https://www.nrca-ds.de/st/TSL-XML.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - DE - - - application/vnd.etsi.tsl+xml - - - - Federal Network Agency - Bundesnetzagentur - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/DE - - - - - - - - - MIIGITCCBQmgAwIBAgIEU3nnPTANBgkqhkiG9w0BAQsFADBAMQswCQYDVQQGEwJESzESMBAGA1UECgwJVFJVU1QyNDA4MR0wGwYDVQQDDBRUUlVTVDI0MDggT0NFUyBDQSBJSTAeFw0xNDA4MjcxMjQzMTVaFw0xNzA4MjcxMjQyMzNaMHsxCzAJBgNVBAYTAkRLMTEwLwYDVQQKDChEaWdpdGFsaXNlcmluZ3NzdHlyZWxzZW4gLy8gQ1ZSOjM0MDUxMTc4MTkwFQYDVQQDDA5UaG9tYXMgVmFuZ3NhYTAgBgNVBAUTGUNWUjozNDA1MTE3OC1SSUQ6NDY1OTM2MTkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgjJ5A00v9n8o0LoW2nuaHiVgTQDEpGr+I4JeE3uV6Vq1XSzvCnI1Gl6yFlPZtgMEjEOh5Par85TH3fSAX38R+253h8cvbtg7NBdNGkirPZXlA4RCEjQx4b45s23JV1fhRtkR74PVvnjwApIFSrAK7m47SssssaFz/18MOrtx2BfsQ2mvcAHJcJqSc1HDV4c5KkDXGfIufd7qRLN+ytRPXDzdrX4ptAk9oNrsO7Bo9oSNC0kHWLucBBmidFFFBtoErJ51xJ3LvV4sDwapNsEJ13lcshQZg79+ETovAr/plJLCXzDhNRTx9EZklTUTQhmXyv2keYo0BfR4H0RZg+MDZAgMBAAGjggLmMIIC4jAOBgNVHQ8BAf8EBAMCBPAwgYkGCCsGAQUFBwEBBH0wezA1BggrBgEFBQcwAYYpaHR0cDovL29jc3AuaWNhMDIudHJ1c3QyNDA4LmNvbS9yZXNwb25kZXIwQgYIKwYBBQUHMAKGNmh0dHA6Ly9tLmFpYS5pY2EwMi50cnVzdDI0MDguY29tL29jZXMtaXNzdWluZzAyLWNhLmNlcjCCAUMGA1UdIASCATowggE2MIIBMgYKKoFQgSkBAQECBTCCASIwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cudHJ1c3QyNDA4LmNvbS9yZXBvc2l0b3J5MIHuBggrBgEFBQcCAjCB4TAQFglUUlVTVDI0MDgwAwIBARqBzEZvciBhbnZlbmRlbHNlIGFmIGNlcnRpZmlrYXRldCBn5mxkZXIgT0NFUyB2aWxr5XIsIENQUyBvZyBPQ0VTIENQLCBkZXIga2FuIGhlbnRlcyBmcmEgd3d3LnRydXN0MjQwOC5jb20vcmVwb3NpdG9yeS4gQmVt5nJrLCBhdCBUUlVTVDI0MDggZWZ0ZXIgdmlsa+VyZW5lIGhhciBldCBiZWdy5m5zZXQgYW5zdmFyIGlmdC4gcHJvZmVzc2lvbmVsbGUgcGFydGVyLjAZBgNVHREEEjAQgQ50aG92YUBkaWdzdC5kazCBlgYDVR0fBIGOMIGLMC6gLKAqhihodHRwOi8vY3JsLmljYTAyLnRydXN0MjQwOC5jb20vaWNhMDIuY3JsMFmgV6BVpFMwUTELMAkGA1UEBhMCREsxEjAQBgNVBAoMCVRSVVNUMjQwODEdMBsGA1UEAwwUVFJVU1QyNDA4IE9DRVMgQ0EgSUkxDzANBgNVBAMMBkNSTDI4OTAfBgNVHSMEGDAWgBSZj7oNia4hGkJ6Cq4aTE4i/xDrjDAdBgNVHQ4EFgQUrQcZJBN9UFBcFU0ejOZzl2AQ20swCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAnJGujDKn1cpIl6LlCMUjIDmcegkcG+VMCasfjm1svOqr/fxHArSUpDKURcZWoNq0dUiWk0JhBUJGEi0UrVZ783jR5Pn9m7VkDhkeqR7iigMgtPvZjwfcWsnjYr+DwLxrRDZADWroOceD6GF0AOkETcDhOunFcroiTd9n4LgzHCELyVhUv8L2nbaWtlCIVxCua861x8jHketSPd8EdcqYsX6TtVdnA5S+A8h88rwrYvrpy5f9e29V6pQzFkq9BTGQ+ZtrbLI6UWV3ja0IBo0tHt/fc+lNuHV56ipz3QGS94AwxkENPSgYKLtwDOoV5c/vI9heE3/FvP1W/409h0ETgw== - - - - - MIIGQjCCBSqgAwIBAgIETJqsxTANBgkqhkiG9w0BAQsFADA/MQswCQYDVQQGEwJESzESMBAGA1UECgwJVFJVU1QyNDA4MRwwGgYDVQQDDBNUUlVTVDI0MDggT0NFUyBDQSBJMB4XDTEzMDgxNDExMDcyOVoXDTE2MDgxNDExMDcxMlowfzELMAkGA1UEBhMCREsxMTAvBgNVBAoMKERpZ2l0YWxpc2VyaW5nc3N0eXJlbHNlbiAvLyBDVlI6MzQwNTExNzgxPTAZBgNVBAMMEkJlbmphbWluIEt5dnNnYWFyZDAgBgNVBAUTGUNWUjozNDA1MTE3OC1SSUQ6MjgxNjAxMTUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCPqu9WOsATGpHZF4Sm8+6VObPBgYpok7foFDQgkhLpqnEAOCLwWN6+eMugKJIS8IaQi9ZhibY8XDfo5NMdhI6hMbiUDVajZ+9qKAAAUPfL9nQrnNCCjff5/M206ih01d4ANh/k6rDczlRvfM6bFMW/CW+o5Bt/WxbIj/DpQTXjHx4Sxf68IGCi9sTc2YHQUVYrCYZkU6CJ3qUFoYTrRO59hDLqpLefp4CeqVmicv0DhgnRL3N0NXPje/Edj0goH+5xVeouvfwdwU3mOx/gAXCAbPQp6GC8vi+26RqQ3S+H75X+nrabyp5F2CH4sGJuif9IrTtXRPGmKuKL4PPQR91ZAgMBAAGjggMEMIIDADAOBgNVHQ8BAf8EBAMCA/gwgZ0GCCsGAQUFBwEBBIGQMIGNMD4GCCsGAQUFBzABhjJodHRwOi8vb2NzcC5vY2VzLWlzc3VpbmcwMS50cnVzdDI0MDguY29tL3Jlc3BvbmRlcjBLBggrBgEFBQcwAoY/aHR0cDovL20uYWlhLm9jZXMtaXNzdWluZzAxLnRydXN0MjQwOC5jb20vb2Nlcy1pc3N1aW5nMDEtY2EuY2VyMIIBQwYDVR0gBIIBOjCCATYwggEyBgoqgVCBKQEBAQIFMIIBIjAvBggrBgEFBQcCARYjaHR0cDovL3d3dy50cnVzdDI0MDguY29tL3JlcG9zaXRvcnkwge4GCCsGAQUFBwICMIHhMBAWCVRSVVNUMjQwODADAgEBGoHMRm9yIGFudmVuZGVsc2UgYWYgY2VydGlmaWthdGV0IGfmbGRlciBPQ0VTIHZpbGvlciwgQ1BTIG9nIE9DRVMgQ1AsIGRlciBrYW4gaGVudGVzIGZyYSB3d3cudHJ1c3QyNDA4LmNvbS9yZXBvc2l0b3J5LiBCZW3mcmssIGF0IFRSVVNUMjQwOCBlZnRlciB2aWxr5XJlbmUgaGFyIGV0IGJlZ3LmbnNldCBhbnN2YXIgaWZ0LiBwcm9mZXNzaW9uZWxsZSBwYXJ0ZXIuMBkGA1UdEQQSMBCBDkJFTktZQGRpZ3N0LmRrMIGgBgNVHR8EgZgwgZUwOKA2oDSGMmh0dHA6Ly9jcmwub2Nlcy1pc3N1aW5nMDEudHJ1c3QyNDA4LmNvbS9pY2EwMTEuY3JsMFmgV6BVpFMwUTELMAkGA1UEBhMCREsxEjAQBgNVBAoMCVRSVVNUMjQwODEcMBoGA1UEAwwTVFJVU1QyNDA4IE9DRVMgQ0EgSTEQMA4GA1UEAwwHQ1JMNjY3NDAfBgNVHSMEGDAWgBTcPiA5BFF1Chj9v4nVrqWlKktydzAdBgNVHQ4EFgQU2x/FpFgBGDFBJYMNttYcFRdvF18wCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAbkhl3LHDnudbKAXwCc99tlAGVWMghkt7zJW1ouaNylxuRrppINCcoXye/hhMqIlSkDPXRNbItmonv5wN11uNe+iPZflo29xeE5XCQ3VVuuwXVWSeOeH4dpAErxfH2FWriLUDSYUtwSa30re4xYktpTA3a9bgHjfKUUuQK31gBiWH9cQ0y+XxcqOMUN+C53iLgxIKHmkPI67ThNMuBA2cOfF6rEDKGjEMh3A6Ntue7wHHgTOidbC/LqYer/2gssDHNqxSiIjlR4IWsJFM5LrQ4FOW8C7gbp47ek6lFK685ccYDEbnwLejlfHe4DQjVHl4a7qlBL4Vle2ogKNHvoEL5A== - - - - http://www.digst.dk/~/media/Files/Loesninger-og-infrastruktur/NemID/HumanReadabletldkxml.pdf - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - DK - - - application/pdf - - - - Danish Agency for Digitisation // CVR:34051178 - Digitaliseringsstyrelsen // CVR:34051178 - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/DK - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - - - - - - - - - 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 - - - - http://www.digst.dk/~/media/Files/Loesninger-og-infrastruktur/NemID/TLDK.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - DK - - - application/vnd.etsi.tsl+xml - - - - Digitaliseringsstyrelsen // CVR:34051178 - Danish Agency for Digitisation // CVR:34051178 - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/DK - - - - - - - - - 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 - - - - https://sr.riik.ee/tsl/estonian-tsl.pdf - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - EE - - - application/pdf - - - - Estonian Technical Regulatory Authority - Tehnilise Järelevalve Amet - Estonian Technical Surveillance Authority - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EE - - - - - - - - - MIIDtDCCApygAwIBAgIJAOGr7PilHGMwMA0GCSqGSIb3DQEBBQUAMHExLjAsBgNVBAMTJUVzdG9uaWFuIFRydXN0ZWQgTGlzdCBTY2hlbWUgT3BlcmF0b3IxCzAJBgNVBAYTAkVFMTIwMAYDVQQKEylFc3RvbmlhbiBUZWNobmljYWwgU3VydmVpbGxhbmNlIEF1dGhvcml0eTAeFw0xMDEwMjkxMzIyNTBaFw0yMDExMDUxMzIyNTBaMHExLjAsBgNVBAMTJUVzdG9uaWFuIFRydXN0ZWQgTGlzdCBTY2hlbWUgT3BlcmF0b3IxCzAJBgNVBAYTAkVFMTIwMAYDVQQKEylFc3RvbmlhbiBUZWNobmljYWwgU3VydmVpbGxhbmNlIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALhdQ9c33Y98JC0pl34+rg+qXLgdjEQaBM9gpxOpIpeqwrcXi5xbLmh4mk6imennbRaZXgJRqrOkx77B+UsBwn6uPgeZenJ1kFGvAOR9aePbgxJ5AggMr4wJXSa03OSGDhptsmMFc86qtnht94mDf1UCn1CNYA7qQHzu4MQwqJ2Ist7IIki89VZD5I4Y5AItMKlEjnHAOw/dlMfI8SxE2vvxCIyQu+rhfGPfwotHi0POyKtkX9Y+JSqEVqRXNw7B2x+d9mRYUJ8EqDvj5ag9dtgyXLsfJ4HdUJMqvoT6QnfwlBbaFusTm3R8SNVXl/8LHDoM5naOSKAOGRSe2OnxAJ8CAwEAAaNPME0wDAYDVR0TBAUwAwIBADALBgNVHQ8EBAMCB4AwHQYDVR0OBBYEFAon+QooAKxPsgZlsTxvK/8synsxMBEGA1UdJQQKMAgGBgQAkTcDADANBgkqhkiG9w0BAQUFAAOCAQEACansBzvd2iwBlZg50oueEtUlFyE+do+FmI4apydq2bM3kdeikWGERSbV1EzD86j7jpNKEOvlPTkV7fZl+7uCJ3OuCrzHEzuaZnvFPkN7Rmj4P1AGh5UK4UVWJwTceuhzIf4D6+/5CNY6U8iEHIqvAmTVOPSKEvxdBv7GKHy6x897icQa8ttHq+xCLmc0+6zpbzSZ5dOmFG3kzJuZPqtqa89Lqf7x6IRRKgUd+C+JsKDMjEde/eYnM8yxdVlzEWe6Z0qKVvPTuiCnhTNhaaQM3aiw61RMTes2Ik4wSGY75XZjQV5gVszHJBEntktcduGWCuJ24qS2lb1M2/8bE43Fkg== - - - - - MIIDsDCCApigAwIBAgIJALIfadr1eVU5MA0GCSqGSIb3DQEBDQUAMG8xLjAsBgNVBAMMJUVzdG9uaWFuIFRydXN0ZWQgTGlzdCBTY2hlbWUgT3BlcmF0b3IxCzAJBgNVBAYTAkVFMTAwLgYDVQQKDCdFc3RvbmlhbiBUZWNobmljYWwgUmVndWxhdG9yeSBBdXRob3JpdHkwHhcNMTYxMTA5MDkyMzUyWhcNMjYwMzAyMDkyMzUyWjBvMS4wLAYDVQQDDCVFc3RvbmlhbiBUcnVzdGVkIExpc3QgU2NoZW1lIE9wZXJhdG9yMQswCQYDVQQGEwJFRTEwMC4GA1UECgwnRXN0b25pYW4gVGVjaG5pY2FsIFJlZ3VsYXRvcnkgQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmHHZWCunThlUFzihuJvv31Xe/eERmbGERYaDRlIXOA/GQI5RQzRF/K3sL/1JMI5kKfDxEIez+U3f7AkhG7VgPqccE5kiY25vyCFK9IrFmFXgPMRC5xI33PMPLXDh2x6fgz9syj4OMvxWtIOxLDpDyGAVMrTlDqjfS/RaWBSVeNNj0ahLRJAwzUICTneney+bFLh1ukAXu8IhRkvV/29/E6ruYb479oERAVrWcjZc/k2tmjPpfZl+QaQMKI59BfHvLRlb7BXfBdD92w5kAnm2nMkV7iwpaKqhLzwgsdmV4zMGaKB9t81e5ZZ94GdVPqxahALp8v5XdSs6k8E+9C0nfQIDAQABo08wTTAMBgNVHRMEBTADAgEAMAsGA1UdDwQEAwIHgDAdBgNVHQ4EFgQUWwVzXPztBt2PkrIA48zQLF8qLjwwEQYDVR0lBAowCAYGBACRNwMAMA0GCSqGSIb3DQEBDQUAA4IBAQBNEPauibTGnPiF+1nMy5o7q1wlmuU1o2KTiDyOUVoqxwEnXyVUv4CRq5/oQ1ZdKf+LOeRFs41lGH4dBh3fdRgauqnlVJldRZf0eBtkNxb54gAVzmWbbIDddIdLCql8Hg64URXBns16Bl5xFHt4cn15CqTwwMHwygAC0nKHN1US5Zs7PEGsAK6QCHq3l7LlzCIBKTh+sAkMUI497cID7YT/rGYZyNC84WXk5wpfnI7uoOxxKkpqMhGj8rbCqeeJkEwpQ8NQ+jIcX7FJNGd//VnoF6XIusx3K/zkxPvc7AZ9w/YELDAK7Frcnqw5Scyucbz4HzkcQKoyu/bta8+0pirg - - - - https://sr.riik.ee/tsl/estonian-tsl.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - EE - - - application/vnd.etsi.tsl+xml - - - - Estonian Technical Regulatory Authority - Tehnilise Järelevalve Amet - Estonian Technical Surveillance Authority - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EE - - - - - - - - - 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 - - - - https://www.eett.gr/tsl/EL-TSL.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - EL - - - application/vnd.etsi.tsl+xml - - - - Hellenic Telecommunications and Post Commission, EETT - Εθνική Επιτροπή Τηλεπικοινωνιών και Ταχυδρομείων - EETT - EETT - EETT - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EL - - - - - - - - - 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 - - - - https://sede.minetur.gob.es/Prestadores/TSL/TSL.pdf - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - ES - - - application/pdf - - - - MINISTRY OF INDUSTRY ENERGY AND TOURISM - MINISTERIO DE INDUSTRIA ENERGIA Y TURISMO - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/ES - - - - - - - - - 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 - - - - https://sede.minetur.gob.es/Prestadores/TSL/TSL.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - ES - - - application/vnd.etsi.tsl+xml - - - - MINISTRY OF INDUSTRY ENERGY AND TOURISM - MINISTERIO DE INDUSTRIA ENERGIA Y TURISMO - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/ES - - - - - - - - - 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 - - - - https://www.viestintavirasto.fi/attachments/HumanReadable_TSL-Ficora.xml.pdf - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - FI - - - application/pdf - - - - Finnish Communications Regulatory Authority - Viestintavirasto - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/FI - - - - - - - - - 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 - - - - https://www.viestintavirasto.fi/attachments/TSL-Ficora.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - FI - - - application/vnd.etsi.tsl+xml - - - - Finnish Communications Regulatory Authority - Viestintavirasto - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/FI - - - - - - - - - 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 - - - - http://www.ssi.gouv.fr/eidas/TL-FR.pdf - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - FR - - - application/pdf - - - - French network and information security agency - Agence nationale de la sécurité des systèmes d'information (ANSSI) - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/FR - - - - - - - - - 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 - - - - http://www.ssi.gouv.fr/eidas/TL-FR.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - FR - - - application/vnd.etsi.tsl+xml - - - - French network and information security agency - Agence nationale de la sécurité des systèmes d'information (ANSSI) - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/FR - - - - - - - - - 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 - - - - http://www.mingo.hr/public/trgovina/TSL-HR.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - HR - - - application/vnd.etsi.tsl+xml - - - - Ministry of the economy - Ministarstvo gospodarstva - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/HR - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - - - - - - - - - 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 - - - - http://www.nmhh.hu/tl/pub/HU_TL.pdf - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - HU - - - application/pdf - - - - National Media and Infocommunications Authority, Hungary - Nemzeti Média- és Hírközlési Hatóság - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/HU - - - - - - - - - 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 - - - - http://www.nmhh.hu/tl/pub/HU_TL.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - HU - - - application/vnd.etsi.tsl+xml - - - - National Media and Infocommunications Authority, Hungary - Nemzeti Média- és Hírközlési Hatóság - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/HU - - - - - - - - - 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 - - - - http://files.dcenr.gov.ie/rh/Irelandtslsigned.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - IE - - - application/vnd.etsi.tsl+xml - - - - Department of Communications, Energy and Natural Resources - An Roinn Cumarsáide, Fuinnimh agus Acmhainní Nádúrtha - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/IE - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - - - - - - - - - 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 - - - - http://www.neytendastofa.is/library/Files/TSl/tsl.pdf - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - IS - - - application/pdf - - - - The Consumer Agency - Neytendastofa - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/IS - - - - - - - - - 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 - - - - http://www.neytendastofa.is/library/Files/TSl/tsl.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - IS - - - application/vnd.etsi.tsl+xml - - - - The Consumer Agency - Neytendastofa - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/IS - - - - - - - - - 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 - - - - https://eidas.agid.gov.it/TL/TSL-IT.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - IT - - - application/vnd.etsi.tsl+xml - - - - Agenzia per l'Italia Digitale - Agenzia per l'Italia Digitale - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/IT - - - - - - - - - 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 - - - - http://www.llv.li/files/ak/xml-llv-ak-tsl.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - LI - - - application/vnd.etsi.tsl+xml - - - - Office for Communications - Amt für Kommunikation - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/LI - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - - - - - - - - - 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 - - - - http://www.rrt.lt/failai/LT-TSL.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - LT - - - application/vnd.etsi.tsl+xml - - - - Communications Regulatory Authority of the Republic of Lithuania - Lietuvos Respublikos ryšių reguliavimo tarnyba - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/LT - - - - - - - - - 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 - - - - https://portail-qualite.public.lu/fr/publications/confiance-numerique/liste-confiance-nationale/tsl-pdf/TSL-PDF.pdf - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - LU - - - application/pdf - - - - ILNAS - ILNAS - Institut Luxembourgeois de la Normalisation, de l'Accréditation, de la Sécurité et qualité des produits et services - ILNAS - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/LU - - - - - - - - - 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 - - - - https://portail-qualite.public.lu/fr/publications/confiance-numerique/liste-confiance-nationale/tsl-xml/TSL-XML.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - LU - - - application/vnd.etsi.tsl+xml - - - - ILNAS - ILNAS - Institut Luxembourgeois de la Normalisation, de l'Accréditation, de la Sécurité et qualité des produits et services - ILNAS - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/LU - - - - - - - - - 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 - - - - http://www.dvi.gov.lv/en/wp-content/uploads/TSL/tsl-lv.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - LV - - - application/vnd.etsi.tsl+xml - - - - Data State Inspectorate - Datu valsts inspekcija - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/LV - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - - - - - - - - - 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 - - - - https://www.mca.org.mt/tsl/MT_TSL.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - MT - - - application/vnd.etsi.tsl+xml - - - - Malta Communications Authority - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/MT - - - - - - - - - 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 - - - - https://www.acm.nl/download/bestand/current-tsl.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - NL - - - application/vnd.etsi.tsl+xml - - - - Authority for Consumers & Markets - Autoriteit Consument en Markt - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/NL - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - - - - - - - - - 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 - - - - http://www.nkom.no/TSL/NO_TSL.PDF - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - NO - - - application/pdf - - - - NASJONAL KOMMUNIKASJONSMYNDIGHET - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/NO - - - - - - - - - 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 - - - - http://www.nkom.no/TSL/NO_TSL.XML - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - NO - - - application/vnd.etsi.tsl+xml - - - - NASJONAL KOMMUNIKASJONSMYNDIGHET - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/NO - - - - - - - - - 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 - - - - https://www.nccert.pl/tsl/PL_TSL.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - PL - - - application/vnd.etsi.tsl+xml - - - - National Bank of Poland - Narodowy Bank Polski - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/PL - - - - - - - - - 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 - - - - https://www.gns.gov.pt/media/1891/TSLPTHR.pdf - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - PT - - - application/pdf - - - - National Security Cabinet of Portugal - Gabinete Nacional de Segurança - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/PT - - - - - - - - - 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 - - - - https://www.gns.gov.pt/media/1894/TSLPT.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - PT - - - application/vnd.etsi.tsl+xml - - - - National Security Cabinet of Portugal - Gabinete Nacional de Segurança - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/PT - - - - - - - - - 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 - - - - http://www.mcsi.ro/Minister/Domenii-de-activitate-ale-MCSI/Tehnologia-Informatiei/Servicii-electronice/Semnatura-electronica/TrustedList-versiunea-pdf - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - RO - - - application/pdf - - - - MINISTRY OF COMMUNICATIONS AND FOR INFORMATION SOCIETY - MINISTERUL COMUNICATIILOR SI PENTRU SOCIETATEA INFORMATIONALA - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/RO - - - - - - - - - MIIFuzCCBKOgAwIBAgIRIAYFFnBjAchKbhVsTXYg/xswDQYJKoZIhvcNAQELBQAwdjELMAkGA1UEBhMCUk8xETAPBgNVBAoTCGNlcnRTSUdOMSkwJwYDVQQLEyBjZXJ0U0lHTiBRdWFsaWZpZWQgQ0EgQ2xhc3MgMyBHMjEpMCcGA1UEAxMgY2VydFNJR04gUXVhbGlmaWVkIENBIENsYXNzIDMgRzIwHhcNMTYwOTA2MDY0NzQzWhcNMTcwOTA2MDY0NzQzWjCB1jELMAkGA1UEBhMCUk8xFzAVBgNVBAcMDk11bi4gQnVjdXJlc3RpMUYwRAYDVQQKDD1NSU5JU1RFUlVMIENPTVVOSUNBVElJTE9SIFNJIFBFTlRSVSBTT0NJRVRBVEVBIElORk9STUFUSU9OQUxBMRUwEwYDVQQDDAxDYXJtZW4gRWxpYW4xFzAVBgNVBAUTDjIwMDYwNTE2NzBFQzE0MRUwEwYDVQQpDAxDYXJtZW4gRWxpYW4xDzANBgNVBCoMBkNhcm1lbjEOMAwGA1UEBAwFRWxpYW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgzGE6IJrhRZNJ/a4Sc+ImJRvXP5PQ25g6haVsQ48r+T/RFtVR3IV3hBn9LBI4du1UVFK6L9xjT2lOBIohqOBIqdkN0d7pA6Lcr7dS3LfdurytqlpD/C0a6XClCvRZj7BJOu+/BNQqMNd1BqDXZ8mqeiUlNQ+ZdhlCk3YXk1rSzi+tt/3xgA1WQdxXaOvsnj4kn5cLy0fIWLZAfJ/jql0SJigteI8K6A6ZnvtM79WaGbyKt4XaFxPEfCcFxD848FisBk9NMreZ05U+xDewXkgYaNwOHFgG3H7GIc6NYoB45JeLNU4E42/498yEq/aIqfa81cmAIOK5x4Pd4L0k5G/RAgMBAAGjggHhMIIB3TBvBggrBgEFBQcBAQRjMGEwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmNlcnRzaWduLnJvMDoGCCsGAQUFBzAChi5odHRwOi8vd3d3LmNlcnRzaWduLnJvL2NlcnRjcmwvcXVhbGlmaWVkZzIuY3J0MA4GA1UdDwEB/wQEAwIGQDAfBgNVHSMEGDAWgBRQNJ5Tdrlt0rcMHpCDdVruy3QYijAdBgNVHQ4EFgQU+QkpXANYg0ZfsGaTdMM6A0xwrJowgYQGA1UdIAR9MHswPgYLKwYBBAGBwzkBAQMwLzAtBggrBgEFBQcCARYhaHR0cDovL3d3dy5jZXJ0c2lnbi5yby9yZXBvc2l0b3J5MDkGBgQAizABATAvMC0GCCsGAQUFBwIBFiFodHRwOi8vd3d3LmNlcnRzaWduLnJvL3JlcG9zaXRvcnkwNwYDVR0fBDAwLjAsoCqgKIYmaHR0cDovL2NybC5jZXJ0c2lnbi5yby9xdWFsaWZpZWRnMi5jcmwwRwYDVR0RBEAwPqAlBgorBgEEAYI3FAIDoBcMFWNhcm1lbi5lbGlhbkBtc2luZi5yb4EVY2FybWVuLmVsaWFuQG1zaW5mLnJvMBEGA1UdJQQKMAgGBgQAkTcDADANBgkqhkiG9w0BAQsFAAOCAQEAp5ffoZRb2ovPAWLHSaWb8iySvqDpkKmN0Ey1W6PetioqXcHF/HzjqqGh7S7DDJP3GrEvT8aC4ykRumFTGH9XlpJ7oiwy1B4zrP+UjNsafXI4KsHLVUEO/llzLq2XaRfXLyRYFixvdN+HqM7TPz7YN0n1SdfyL1L9AMTLI86QpfxFEtwlZuseXL99oNwN1xWF6N9pMvAaG1HQAm5e1sr7El5zUQDEY43h4ofWHtn3eAw8EqcNu13sbkxxhnzSMSqgaBj5Yo0KD/mC56VPv2eTBBfv4vRJodfHSZo3XvzyNMK1hEMcYHQIy9UgtUz/7QhtZjkyvADvX/W9yMdZdmmz3A== - - - - - MIIFxjCCBK6gAwIBAgIRIAYFFnBjAchhBz3R9pFg1B4wDQYJKoZIhvcNAQELBQAwdjELMAkGA1UEBhMCUk8xETAPBgNVBAoTCGNlcnRTSUdOMSkwJwYDVQQLEyBjZXJ0U0lHTiBRdWFsaWZpZWQgQ0EgQ2xhc3MgMyBHMjEpMCcGA1UEAxMgY2VydFNJR04gUXVhbGlmaWVkIENBIENsYXNzIDMgRzIwHhcNMTYwOTA2MDcwNjA0WhcNMTcwNjA2MDcwNjA0WjCB3TELMAkGA1UEBhMCUk8xFzAVBgNVBAcMDk11bi4gQnVjdXJlc3RpMUYwRAYDVQQKDD1NSU5JU1RFUlVMIENPTVVOSUNBVElJTE9SIFNJIFBFTlRSVSBTT0NJRVRBVEVBIElORk9STUFUSU9OQUxBMRcwFQYDVQQDDA5MdWNpYW4gUHJpY2luYTEYMBYGA1UEBRMPMjAwNjA1MTY3MFBMMTI0MRcwFQYDVQQpDA5MdWNpYW4gUHJpY2luYTEPMA0GA1UEKgwGTHVjaWFuMRAwDgYDVQQEDAdQcmljaW5hMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2heA8j1rBYSr4dTQr5J5mwDua7YehvakDwZjQ59efRWtmtjfZN/+b+jweNSNwRguHOpwLABr1mV5fTxjMHoSbBTDHyIhglj3BWApqfNt3kp5qzvR9cX9LzyNI2tS76Stf9fRUwwS8AdGaeWxi5oHBy3lLhj9zDL3UlS3MPHY/To+y+1amPb7Q14CYmCoCbFoXgWBPIy9tpveNNryroQAntk6Fb6tYty+B5E/R0Og9E+D/o+leXnDUTqCrIk3toup0Uitba8cvdLn8DdG9y2m8gslUSXPb+0j5IqFbYV59kRQo8fmCOJ1tKm1K+CqOgy4qsKYQKrJyGRjP7/xWIPgQIDAQABo4IB5TCCAeEwbwYIKwYBBQUHAQEEYzBhMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5jZXJ0c2lnbi5ybzA6BggrBgEFBQcwAoYuaHR0cDovL3d3dy5jZXJ0c2lnbi5yby9jZXJ0Y3JsL3F1YWxpZmllZGcyLmNydDAOBgNVHQ8BAf8EBAMCBkAwHwYDVR0jBBgwFoAUUDSeU3a5bdK3DB6Qg3Va7st0GIowHQYDVR0OBBYEFAZlL022EaO9/ge5GQA+XHJzv9pFMIGEBgNVHSAEfTB7MD4GCysGAQQBgcM5AQEDMC8wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cuY2VydHNpZ24ucm8vcmVwb3NpdG9yeTA5BgYEAIswAQEwLzAtBggrBgEFBQcCARYhaHR0cDovL3d3dy5jZXJ0c2lnbi5yby9yZXBvc2l0b3J5MDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly9jcmwuY2VydHNpZ24ucm8vcXVhbGlmaWVkZzIuY3JsMEsGA1UdEQREMEKgJwYKKwYBBAGCNxQCA6AZDBdsdWNpYW4ucHJpY2luYUBtc2luZi5yb4EXbHVjaWFuLnByaWNpbmFAbXNpbmYucm8wEQYDVR0lBAowCAYGBACRNwMAMA0GCSqGSIb3DQEBCwUAA4IBAQAnE87jjYb/eFNOzAgLuVwB1BGnFfaIgVP3hXtURSHzt/a9l5u8DU6W8JQOQ8mkXlB0IfxUCdWPsVrqyfOBdc/xhXkouiH6StjDbTojaHeGcaKGujkJqzHbV7VcgsvEKdXktgV/FRF+cN/ifVi7Zl6BUdkoZUYxn5Gw5g6sO9CWkoBScM9Ff44ngpTKLIzoKY81EBJ4s3p1VBiXeWj7NHxYTmMca8WWVRecphwghaHzSIbdEP4m38obGsRpEELCX1/wo4U4XmmDJRztN/RC1xlo5bMnajQ3iNGIqqQveXQdTgz7X2/zhPRN88uqFvT6gYLcT+De1e+gNXfMHgOdEHEn - - - - - MIIF/jCCBOagAwIBAgIRIAYFFnBjAchievGlqLzwuUwwDQYJKoZIhvcNAQELBQAwdjELMAkGA1UEBhMCUk8xETAPBgNVBAoTCGNlcnRTSUdOMSkwJwYDVQQLEyBjZXJ0U0lHTiBRdWFsaWZpZWQgQ0EgQ2xhc3MgMyBHMjEpMCcGA1UEAxMgY2VydFNJR04gUXVhbGlmaWVkIENBIENsYXNzIDMgRzIwHhcNMTYwOTA2MDcwNzAyWhcNMTcwNjA2MDcwNzAyWjCCARAxCzAJBgNVBAYTAlJPMRcwFQYDVQQHDA5NdW4uIEJ1Y3VyZXN0aTFGMEQGA1UECgw9TUlOSVNURVJVTCBDT01VTklDQVRJSUxPUiBTSSBQRU5UUlUgU09DSUVUQVRFQSBJTkZPUk1BVElPTkFMQTEnMCUGA1UEAwweUm9tdWx1cy1SYWR1LUNvcm5lbGl1IER1bWl0cml1MRkwFwYDVQQFExAyMDA2MDUxNjcwRENSUkMxMSkwJwYDVQQpDCBSb211bHVzLVJhZHUtQ29ybmVsaXUgQyBEdW1pdHJpdTEeMBwGA1UEKgwVUm9tdWx1cy1SYWR1LUNvcm5lbGl1MREwDwYDVQQEDAhEdW1pdHJpdTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMU+QiVwgf6tRg1inMQN8WHSQift/yC1x8neV1tnjCL+QuyGQsQOZzaQjVYurcsla/zjTP34xzvtF/HuHYIaBIrgrzHHNvOaTs3o13KLiytjZllkB4N80tsKs/XIKmnLhfOxtfzA5bdQAqLq/ztHFMo7iufaZ1YHd2gL+nyCe7DiFahbGvl50KIQ5YbRwVtWMHe3J95HHy9l+nbgc6OY4sucSk7wDEcDQClCSHka2MYfITpe9Jz8HKPDoRUEf2YyxYE7XWzlzrVUZqtDbIg/Gt6Wrfy4N+foZbkcO9Ih8i1YhYlQv6CnoFlJlGNH5dbc932B+SR+qRQ8g6qZY3lCynECAwEAAaOCAekwggHlMG8GCCsGAQUFBwEBBGMwYTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuY2VydHNpZ24ucm8wOgYIKwYBBQUHMAKGLmh0dHA6Ly93d3cuY2VydHNpZ24ucm8vY2VydGNybC9xdWFsaWZpZWRnMi5jcnQwDgYDVR0PAQH/BAQDAgZAMB8GA1UdIwQYMBaAFFA0nlN2uW3StwwekIN1Wu7LdBiKMB0GA1UdDgQWBBQ7rPfCmpkWuNGF47BjljApRHnJlDCBhAYDVR0gBH0wezA+BgsrBgEEAYHDOQEBAzAvMC0GCCsGAQUFBwIBFiFodHRwOi8vd3d3LmNlcnRzaWduLnJvL3JlcG9zaXRvcnkwOQYGBACLMAEBMC8wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cuY2VydHNpZ24ucm8vcmVwb3NpdG9yeTA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmNlcnRzaWduLnJvL3F1YWxpZmllZGcyLmNybDBPBgNVHREESDBGoCkGCisGAQQBgjcUAgOgGwwZcm9tdWx1cy5kdW1pdHJpdUBtc2luZi5yb4EZcm9tdWx1cy5kdW1pdHJpdUBtc2luZi5ybzARBgNVHSUECjAIBgYEAJE3AwAwDQYJKoZIhvcNAQELBQADggEBAG6/bHBbt+4Nc1s3KV+ASCeE7AIJW6Aff1q5hv7rlbOah9Gubls3Ucta5ij//oQd2iviHRsaFJo3ICvDPzrblH/dnGadgydVHO9hqg3oKmqhRTwXS2ELj5ZGzTEvTAJaCfS0BgTVJqbXj9aSZ6d2e3u5ndK7fadxHd/7H5gQK6pgnO+EadWHWFfIOtwTnzf78AcpArstBBjJkYf/liOa9s6yX0pqw1pUcGSYCLzWm+7529l6U7J5ctf3FHjtt1mW8jBVXZAwHQD5dzKfO2uQofOLarJiCIvAyYpkYVcZr9i5WS4cH5Iv4AukNQ7JjFzGxFCMSl4/k3fB3x99erHHe3Q= - - - - http://www.mcsi.ro/Minister/Domenii-de-activitate-ale-MCSI/Tehnologia-Informatiei/Servicii-electronice/Semnatura-electronica/TrustedList-versiunea-xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - RO - - - application/vnd.etsi.tsl+xml - - - - MINISTRY OF COMMUNICATIONS AND FOR INFORMATION SOCIETY - MINISTERUL COMUNICATIILOR SI PENTRU SOCIETATEA INFORMATIONALA - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/RO - - - - - - - - - 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 - - - - https://trustedlist.pts.se/SE-TL.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - SE - - - application/vnd.etsi.tsl+xml - - - - Swedish Post and Telecom Agency (PTS) - Post- och telestyrelsen (PTS) - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/SE - - - - - - - - - MIIFdDCCBFygAwIBAgIEOl6PRjANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJzaTEbMBkGA1UEChMSc3RhdGUtaW5zdGl0dXRpb25zMREwDwYDVQQLEwhzaWdvdi1jYTAeFw0xMzAzMDUxMDU2MDZaFw0xODAzMDUxMzI4MzVaMIGJMQswCQYDVQQGEwJzaTEbMBkGA1UEChMSc3RhdGUtaW5zdGl0dXRpb25zMRkwFwYDVQQLExB3ZWItY2VydGlmaWNhdGVzMRMwEQYDVQQLEwpHb3Zlcm5tZW50MS0wFAYDVQQFEw0xMjM1MTc0MjE0MDI3MBUGA1UEAxMORGltaXRyaWogU2themEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCJxPypF9ZVssjvPT/he9cZ/DdBn3htrapLJqHISc1ylop1CpkL0fbPTL9xK3JnaMzzmucbeTkwj2fyEaluP2bl1+ElpMWDYUq59mDOGvpB5KaJvTCXGUdf3rZTFSVOf7WarhI9uR25sjZg1wwVKGJ9VTqVtAlD5WBsIyT2CN1xWj3DXy+faqGtYbd/4mpzMW+qvTJQ9act6rlmTXJXwOVBTYwVEciTqX+IMX1nIn93FEOl6Q9BQeAYFe8pVXbTjoveY7KIE2SyWETogYplMDesK3hWB6cGfnWD05+Vbj78hKFyxSjoKTJegxzk6+8nGy0dzkjup1nlpTrjDBr1Zgt9AgMBAAGjggItMIICKTAOBgNVHQ8BAf8EBAMCBaAwSgYDVR0gBEMwQTA1BgorBgEEAa9ZAQcBMCcwJQYIKwYBBQUHAgEWGWh0dHA6Ly93d3cuY2EuZ292LnNpL2Nwcy8wCAYGBACLMAEBMCIGCCsGAQUFBwEDBBYwFDAIBgYEAI5GAQEwCAYGBACORgEEMCAGA1UdEQQZMBeBFWRpbWl0cmlqLnNrYXphQGdvdi5zaTCB8QYDVR0fBIHpMIHmMFWgU6BRpE8wTTELMAkGA1UEBhMCc2kxGzAZBgNVBAoTEnN0YXRlLWluc3RpdHV0aW9uczERMA8GA1UECxMIc2lnb3YtY2ExDjAMBgNVBAMTBUNSTDQxMIGMoIGJoIGGhldsZGFwOi8veDUwMC5nb3Yuc2kvb3U9c2lnb3YtY2Esbz1zdGF0ZS1pbnN0aXR1dGlvbnMsYz1zaT9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0P2Jhc2WGK2h0dHA6Ly93d3cuc2lnb3YtY2EuZ292LnNpL2NybC9zaWdvdi1jYS5jcmwwKwYDVR0QBCQwIoAPMjAxMzAzMDUxMDU2MDZagQ8yMDE4MDMwNTEzMjgzNVowHwYDVR0jBBgwFoAUHvjUU2uzgwbpBAZXAvmlv8ZYPHIwHQYDVR0OBBYEFPkW6/pilxObPEzBAucEf/wHqwgdMAkGA1UdEwQCMAAwGQYJKoZIhvZ9B0EABAwwChsEVjcuMQMCA6gwDQYJKoZIhvcNAQEFBQADggEBAI+3jSydwmTfTuFJxIys5PFZGzWNX8pCcyyuYFnbPbsnWwVMA1wE/FazkN51U0E2nTsYlooal4uiZ0u5jgbXW7wBvAIept/mJNyXXLd/il5JiB0Bz76GsGNmw1DoX2lvV06x39NI9X3+ea2rp7L56co3kVJPmFbJImyYc5OK5H9dXjGpIcxzVyWXNoUSbhVZpljIw5Tka+c5/G0gE49o3PiexXH2fziGBAmbICn+eX6+zeSo80OB0DiPRMD0s31IitQfEv1N3H+lz21Pa8gKEKpKw7Ns7b4nMGfw8WQyiVHNNSo95RlCaHPFfeFR5vkDuUayHqGwErB1Zdx8AIjzR+w= - - - - - MIIFdDCCBFygAwIBAgIEOl5EOjANBgkqhkiG9w0BAQUFADA9MQswCQYDVQQGEwJzaTEbMBkGA1UEChMSc3RhdGUtaW5zdGl0dXRpb25zMREwDwYDVQQLEwhzaWdvdi1jYTAeFw0xMTEyMDgwOTU4MzhaFw0xNjEyMDgyMTQxNDFaMIGJMQswCQYDVQQGEwJzaTEbMBkGA1UEChMSc3RhdGUtaW5zdGl0dXRpb25zMRkwFwYDVQQLExB3ZWItY2VydGlmaWNhdGVzMRMwEQYDVQQLEwpHb3Zlcm5tZW50MS0wFAYDVQQFEw0xMjM0NjYyNjE0MDQ2MBUGA1UEAxMOTWFydXNrYSBEYW1qYW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCMrQtDhrYKxtQeHBVfhfkB9q6axI0SmPwcIRqEFGWfhnPhQwvPa8vSrE3SBrJnKx3bxLHdw/hzM8hDfhsQM5rwDYN8qfVv1qnttITRlBZqd7qSzQeD/QegjC2yZMIun/e/Gjz450+oXoGlgiB9Ir9DRuqCDq/lmMuftjYUc8uWQj/YwpmQrJNqDymbTInuclDM8zB5eUc6x/7jWs2QxdleY0rOR3H9GAUFCUMQjSYbvZfy+ptCGB1adST4/5o6DBOBpKakbz4tmrroUYqf7YBXzImiPCcyQxYFADGUboWWQ8QYiVPgED37/wkO+XGeYehuQ0jY61DDjc9YubxMUTbtAgMBAAGjggItMIICKTAOBgNVHQ8BAf8EBAMCBaAwSgYDVR0gBEMwQTA1BgorBgEEAa9ZAQcBMCcwJQYIKwYBBQUHAgEWGWh0dHA6Ly93d3cuY2EuZ292LnNpL2Nwcy8wCAYGBACLMAEBMCIGCCsGAQUFBwEDBBYwFDAIBgYEAI5GAQEwCAYGBACORgEEMCAGA1UdEQQZMBeBFW1hcnVza2EuZGFtamFuQGdvdi5zaTCB8QYDVR0fBIHpMIHmMFWgU6BRpE8wTTELMAkGA1UEBhMCc2kxGzAZBgNVBAoTEnN0YXRlLWluc3RpdHV0aW9uczERMA8GA1UECxMIc2lnb3YtY2ExDjAMBgNVBAMTBUNSTDM0MIGMoIGJoIGGhldsZGFwOi8veDUwMC5nb3Yuc2kvb3U9c2lnb3YtY2Esbz1zdGF0ZS1pbnN0aXR1dGlvbnMsYz1zaT9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0P2Jhc2WGK2h0dHA6Ly93d3cuc2lnb3YtY2EuZ292LnNpL2NybC9zaWdvdi1jYS5jcmwwKwYDVR0QBCQwIoAPMjAxMTEyMDgwOTU4MzhagQ8yMDE2MTIwODIxNDE0MVowHwYDVR0jBBgwFoAUHvjUU2uzgwbpBAZXAvmlv8ZYPHIwHQYDVR0OBBYEFO2tqCIZmlWRrpJXC+r5nVGPwNaAMAkGA1UdEwQCMAAwGQYJKoZIhvZ9B0EABAwwChsEVjcuMQMCA6gwDQYJKoZIhvcNAQEFBQADggEBAJZvcjQy6OXcg/aHJRCwiKxyUZSXrazeyvBmkrrLK+2vMNyaFsJWQIIEKb9tWCrrQOXsBhzgGXLh5kr+Bt89pMANUYXanP5dlZo3A1h0xvfvGaKOhcZclZz+h4IGc/SBy9Xd/BJa9ttIqdSwH+8k29N4YhM9AIVb3vBszDDgLTU2xuFMIqDX+rbZnF9PmFbtKzGQjevOqG/4y61sZSa7pgPjhxTj4mqpK/AN40giiaRNJv+z3E9Xh71S4CriSeBW2GJsPS+v7dEw775fWPuQJEvDYZ1X754lmFp3RTOtlIqQTxCgajRF4O8mWEYb2BH3N64e8yEoaxvVHdbV9aUQ0Mg= - - - - - MIIGezCCBOOgAwIBAgIMZPvOUgAAAABWfBqmMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAlNJMRwwGgYDVQQKExNSZXB1Ymxpa2EgU2xvdmVuaWphMRcwFQYDVQRhEw5WQVRTSS0xNzY1OTk1NzERMA8GA1UEAxMIU0lHT1YtQ0EwHhcNMTYxMTIzMDkwNjM4WhcNMjExMTIzMDkzNjM4WjCBlDELMAkGA1UEBhMCU0kxGjAYBgNVBAoTEXN0YXRlIGF1dGhvcml0aWVzMRkwFwYDVQQLExB3ZWItY2VydGlmaWNhdGVzMU4wDQYDVQQEEwZEYW1qYW4wDwYDVQQqDAhNYXJ1xaFrYTAUBgNVBAUTDTEyMzQ2NjI2MTQwNTQwFgYDVQQDDA9NYXJ1xaFrYSBEYW1qYW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCWiaeU7UpnlxZauoSCU5TAbhAFC1JJm9WGqDKKwHWt1H/62loMKkb0p8EX1R6kn1p17JW2ppM+GrXNkJip4FiszsQ8NV0T+zwHrGwSW8Ho2Y1vGT2cdmUbhfhvOF9auzDBfd3cI8VnDVesgmZvQiF/zkS0Gu6+xMrfENt49H+iougCNJea3kPWPAdMxxEfhOjFHcsMdE4ZNIcsGg4+NiQx/Rk4P9qlBJfzvGOOdVWV/I+K8fj4lSG1ey0Ld6PZaZpw3NBB8nWRJo6FdebWrr12M/HTDWzkg9ON9yuFI1v8XLwx61CfNc8bk+dFUIOSk+W+Y9cvyOrACpcaLRk7GRZFAgMBAAGjggKHMIICgzAOBgNVHQ8BAf8EBAMCBeAwSgYDVR0gBEMwQTA1BgorBgEEAa9ZAQIIMCcwJQYIKwYBBQUHAgEWGWh0dHA6Ly93d3cuY2EuZ292LnNpL2Nwcy8wCAYGBACLMAEBMCIGCCsGAQUFBwEDBBYwFDAIBgYEAI5GAQEwCAYGBACORgEEMHcGCCsGAQUFBwEBBGswaTA+BggrBgEFBQcwAoYyaHR0cDovL3d3dy5zaWdvdi1jYS5nb3Yuc2kvY3J0L3NpZ292LWNhMi1jZXJ0cy5wN2MwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLnNpZ292LWNhLmdvdi5zaTAgBgNVHREEGTAXgRVtYXJ1c2thLmRhbWphbkBnb3Yuc2kwggExBgNVHR8EggEoMIIBJDCBsaCBrqCBq4YsaHR0cDovL3d3dy5zaWdvdi1jYS5nb3Yuc2kvY3JsL3NpZ292LWNhMi5jcmyGe2xkYXA6Ly94NTAwLmdvdi5zaS9jbj1TSUdPVi1DQSxvcmdhbml6YXRpb25JZGVudGlmaWVyPVZBVFNJLTE3NjU5OTU3LG89UmVwdWJsaWthJTIwU2xvdmVuaWphLGM9U0k/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDBuoGygaqRoMGYxCzAJBgNVBAYTAlNJMRwwGgYDVQQKExNSZXB1Ymxpa2EgU2xvdmVuaWphMRcwFQYDVQRhEw5WQVRTSS0xNzY1OTk1NzERMA8GA1UEAxMIU0lHT1YtQ0ExDTALBgNVBAMTBENSTDgwEwYDVR0jBAwwCoAIRl5A5VPt/v4wEQYDVR0OBAoECEk3AMFdhU1VMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggGBAK/GxlHRRak7y9Hq8sXyQmqvWKG4yklOBPRkSWhPTrlCgnqg6mRwmtFjaRceVTshQdHNLuA2t/LrgNl7WYh77tI/sn4iYCOUVKOmnkD9HxOr5byag9Vc5GX3tT9tgFBWyj+4x2R5I3ACXCudEcWEfEr1Lazbrnnr2M70n6Qlun5/dh2QJPLxYZj8yME3XocJvlrmybHzrl1C1xgw6764D9Iu/8VVdXO7uB7DsMYLuxzdpovUUdPT4zVM+taZt1pprXm1NMLZyeUxvQizVedUcd1TI4OKApR4wbsOpnQ1u5fxdBcklDh93FjW6B3AmwiNsnKLJucWWMyx0VvWdDp8ajl8HngC1PRrswhb3JuGWfw9OeiVDivlVSaMecQh8TmItyBEYzGCDyuxCS8X5iGgsQBfEB2OmhZrsdVUY/amgMJINn7pz0aolyodvjcbiHboVeFmIYl+L/tF9dCbr4K2lDIH31BD+omkY6hTKYdCNudNeZhTvwNN+Q8FBOh0qwcsWQ== - - - - http://www.mju.gov.si/fileadmin/mju.gov.si/pageuploads/DID/Informacijska_druzba/eIDAS/SI_TL.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - SI - - - application/vnd.etsi.tsl+xml - - - - Republic of Slovenia, Ministry of Public Administration, Information Society Directorate - Republika Slovenija, Ministrstvo za javno upravo, Direktorat za informacijsko družbo - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/SI - - - - - - - - - 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 - - - - http://ep.nbusr.sk/kca/tsl/tsl_hrf.zip - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - SK - - - application/pdf - - - - NATIONAL SECURITY AUTHORITY - NÁRODNÝ BEZPEČNOSTNÝ ÚRAD - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/SK - - - - - - - - - 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 - - - - http://ep.nbusr.sk/kca/tsl/tsl.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - SK - - - application/vnd.etsi.tsl+xml - - - - NATIONAL SECURITY AUTHORITY - NÁRODNÝ BEZPEČNOSTNÝ ÚRAD - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/SK - - - - - - - - - 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 - - - - http://www.tscheme.org/UK_TSL/HR_TSL-UKsigned.pdf - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - UK - - - application/pdf - - - - tScheme Limited - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/UK - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - - - - - - - - - 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 - - - - http://www.tscheme.org/UK_TSL/TSL-UKsigned.xml - - - http://uri.etsi.org/TrstSvc/TrustedList/TSLType/EUgeneric - - - UK - - - application/vnd.etsi.tsl+xml - - - - tScheme Limited - - - - - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/UK - http://uri.etsi.org/TrstSvc/TrustedList/schemerules/EUcommon - - - - - - 2017-01-23T11:00:00Z - - 2017-07-23T00:00:00Z - - - https://ec.europa.eu/information_society/policy/esignature/trusted-list/tl-mp.xml - - -tSH0yYfshkXbKEW9q7ygXDQg0HPjd+Ju/Em8vmyXwAg=OPmlh/dNag4OLkcP1Q2yHVkbb5Liac8BT1ZP22s967k=NYi2oD0remLhtKDHWHwgQrlhiXDdSMKhAHlTien2TyA0CTgub6HHN3OgyCft5Qy+1PB23osDqHVn7im5Ko8YGUK9MDY1w0F1jRSMRYWvtn1NKZTRrCNFWc7zX7fEiCjV8fwdk3K4TdZ1CvBqLK/VYFAt1QHWAYvIRhCS8Ae9G28=MIID/DCCAuSgAwIBAgIQEAAAAAAAWgS4SGkJJUcHdzANBgkqhkiG9w0BAQUFADAzMQswCQYDVQQGEwJCRTETMBEGA1UEAxMKQ2l0aXplbiBDQTEPMA0GA1UEBRMGMjAxMzA2MB4XDTEzMDcxNzE3NDQwOFoXDTE4MDcxMzIzNTk1OVowbjELMAkGA1UEBhMCQkUxITAfBgNVBAMTGFBpZXJyZSBEYW1hcyAoU2lnbmF0dXJlKTEOMAwGA1UEBBMFRGFtYXMxFjAUBgNVBCoMDVBpZXJyZSBBbmRyw6kxFDASBgNVBAUTCzYwMDIxMjExOTE5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMv+7DvhzLwG3prirUDGaYRS2+jBZtN2cYXuloKSqAc5Q58FEmk0gsZRF+/4dkt8hgCvbBcpmG6FcvTfNxQbxPX88yYwpBYsWnJ3aD5P4QrN2+fZxwxfXxRRcX+t30IBpr+WYFv/GhJhoFo0LWUehC4eyvnMfP4J/MR4TGlQRrcwIDAQABo4IBUzCCAU8wHwYDVR0jBBgwFoAUww/Dck0/3rI43jkuR2RQ//KP88cwbgYIKwYBBQUHAQEEYjBgMDYGCCsGAQUFBzAChipodHRwOi8vY2VydHMuZWlkLmJlbGdpdW0uYmUvYmVsZ2l1bXJzMi5jcnQwJgYIKwYBBQUHMAGGGmh0dHA6Ly9vY3NwLmVpZC5iZWxnaXVtLmJlMEQGA1UdIAQ9MDswOQYHYDgJAQECATAuMCwGCCsGAQUFBwIBFiBodHRwOi8vcmVwb3NpdG9yeS5laWQuYmVsZ2l1bS5iZTA5BgNVHR8EMjAwMC6gLKAqhihodHRwOi8vY3JsLmVpZC5iZWxnaXVtLmJlL2VpZGMyMDEzMDYuY3JsMA4GA1UdDwEB/wQEAwIGQDARBglghkgBhvhCAQEEBAMCBSAwGAYIKwYBBQUHAQMEDDAKMAgGBgQAjkYBATANBgkqhkiG9w0BAQUFAAOCAQEAEE3KGmLX5XXqArQwIZQmQEE6orKSu3a1z8ey1txsZC4rMk1vpvC6MtsfDaU4N6ooprhcM/WAlcIGOPCNhvxV+xcY7gUBwa6myiClnK0CMSiGYHqWcJG8ns13B9f0+5PJqsoziPoksXb2A9VXkr5aEdEmBYLjh7wG7GwAuDgDT0v87qtphN02/MAlJcNqT3JUUAotD7yfEybmK245jKo+pTYeCHGh7r1HzVWhbUDcQ/e1PpQXjVqBmr4k1ACtuu4H19t6K1P5kf7ta5JFEJPFgy3Hxt6YqzoY07WTVEpS4gJqtleIdX1Fhse7jq83ltcCzlfysBRqY/okUzipo1rbQw==2017-01-23T11:48:02ZXp+nyHNshuOGZLoa8NBCQ3XuXDw=2.5.4.5=#1306323031333036,CN=Citizen CA,C=BE21267647932559079066510326516695893879application/octet-stream \ No newline at end of file From 3f76833569d6db4a50dbe8e5ad7a3e63712c3394 Mon Sep 17 00:00:00 2001 From: Raul Metsma Date: Thu, 20 Mar 2025 21:31:45 +0200 Subject: [PATCH 2/4] Remove Reacability code and use newer Network API Signed-off-by: Raul Metsma --- MoppApp/MoppApp/AddresseeViewController.swift | 2 +- MoppApp/MoppApp/ContainerSignatureCell.swift | 21 +- .../MoppApp/DiagnosticsViewController.swift | 2 +- .../InitializationViewController.swift | 10 +- MoppApp/MoppApp/MobileIDSignature.swift | 4 +- MoppApp/MoppApp/NFCSignature.swift | 4 +- MoppApp/MoppApp/ProxyViewController.swift | 2 +- MoppApp/MoppApp/SettingsConfiguration.swift | 12 +- .../SigningCategoryViewController.swift | 10 +- MoppApp/MoppApp/SivaUtil.swift | 3 +- MoppApp/MoppApp/SmartIDSignature.swift | 4 +- MoppLib/MoppLib.xcodeproj/project.pbxproj | 45 +--- MoppLib/MoppLib/MoppLibDigidocManager.h | 14 +- MoppLib/MoppLib/MoppLibDigidocManager.mm | 120 ++------- MoppLib/MoppLib/PublicInterface/MoppLib.h | 2 - .../PublicInterface/MoppLibContainerActions.h | 16 +- ...erActions.m => MoppLibContainerActions.mm} | 32 ++- .../MoppLibDigidocValidateOnline.h | 33 --- .../MoppLibDigidocValidateOnline.m | 39 --- .../MoppLib/PublicInterface/MoppLibManager.h | 52 ---- .../MoppLib/PublicInterface/MoppLibManager.m | 76 ------ .../PublicInterface/MoppLibManager.swift | 72 ++++++ MoppLib/MoppLib/Reachability/Reachability.h | 62 ----- MoppLib/MoppLib/Reachability/Reachability.m | 242 ------------------ 24 files changed, 161 insertions(+), 718 deletions(-) rename MoppLib/MoppLib/PublicInterface/{MoppLibContainerActions.m => MoppLibContainerActions.mm} (79%) delete mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibDigidocValidateOnline.h delete mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibDigidocValidateOnline.m delete mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibManager.h delete mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibManager.m create mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibManager.swift delete mode 100644 MoppLib/MoppLib/Reachability/Reachability.h delete mode 100644 MoppLib/MoppLib/Reachability/Reachability.m diff --git a/MoppApp/MoppApp/AddresseeViewController.swift b/MoppApp/MoppApp/AddresseeViewController.swift index 7354fdf61..1f6b4124a 100644 --- a/MoppApp/MoppApp/AddresseeViewController.swift +++ b/MoppApp/MoppApp/AddresseeViewController.swift @@ -93,7 +93,7 @@ class AddresseeViewController : MoppViewController { selectedIndexes = [] showLoading(show: true) - if (!MoppLibManager.sharedInstance().isConnected()) { + if (!MoppLibManager.shared.isConnected) { self.infoAlert(message: L(.noConnectionMessage)) self.showLoading(show: false) return diff --git a/MoppApp/MoppApp/ContainerSignatureCell.swift b/MoppApp/MoppApp/ContainerSignatureCell.swift index b690e1703..4382282b2 100644 --- a/MoppApp/MoppApp/ContainerSignatureCell.swift +++ b/MoppApp/MoppApp/ContainerSignatureCell.swift @@ -44,13 +44,7 @@ class ContainerSignatureCell: UITableViewCell { weak var delegate: ContainerSignatureDelegate? = nil var signatureStatus: MoppLibSignatureStatus? - - #if USE_TEST_DDS - let useTestDDS = true - #else - let useTestDDS = false - #endif - + enum ColorTheme { case neutral case showInvalid @@ -137,16 +131,9 @@ class ContainerSignatureCell: UITableViewCell { } func setRoleText(signature: MoppLibSignature) { - let rolesData = signature.roleAndAddressData.roles - if let roles = rolesData, !roles.isEmpty { - roleInfo.text = roles.joined(separator: " / ") - roleInfo.isHidden = false - setNeedsUpdateConstraints() - } else { - roleInfo.text = "" - roleInfo.isHidden = true - setNeedsUpdateConstraints() - } + roleInfo.isHidden = signature.roleAndAddressData.roles.isEmpty + roleInfo.text = signature.roleAndAddressData.roles.joined(separator: " / ") + setNeedsUpdateConstraints() roleInfo.resetLabelProperties() } diff --git a/MoppApp/MoppApp/DiagnosticsViewController.swift b/MoppApp/MoppApp/DiagnosticsViewController.swift index bd87a182f..4a4796a6e 100644 --- a/MoppApp/MoppApp/DiagnosticsViewController.swift +++ b/MoppApp/MoppApp/DiagnosticsViewController.swift @@ -142,7 +142,7 @@ class DiagnosticsViewController: MoppViewController, UIDocumentPickerDelegate { appVersionLabel.text = "\(L(.diagnosticsAppVersion)): \(MoppApp.versionString)" opSysVersionLabel.text = "\(L(.diagnosticsIosVersion)): iOS \(MoppApp.iosVersion)" librariesTitleLabel.text = L(.diagnosticsLibrariesLabel) - let libdigidocppVersion = MoppLibManager.sharedInstance().libdigidocppVersion() ?? String() + let libdigidocppVersion = MoppLibContainerActions.libdigidocppVersion() ?? String() librariesLabel.text = "libdigidocpp \(libdigidocppVersion)" tslCacheLabel.text = L(.diagnosticsTslCacheLabel) centralConfigurationLabel.text = L(.centralConfigurationLabel) diff --git a/MoppApp/MoppApp/InitializationViewController.swift b/MoppApp/MoppApp/InitializationViewController.swift index e17e9010b..1b266b551 100644 --- a/MoppApp/MoppApp/InitializationViewController.swift +++ b/MoppApp/MoppApp/InitializationViewController.swift @@ -32,14 +32,7 @@ class InitializationViewController : UIViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) - -#if USE_TEST_DDS - let useTestDDS = true -#else - let useTestDDS = false -#endif - - MoppLibManager.sharedInstance().setup(success: { + MoppLibContainerActions.setup(success: { DispatchQueue.main.async { MoppApp.instance.setupTabController() } @@ -49,7 +42,6 @@ class InitializationViewController : UIViewController { MoppApp.instance.setupTabController() } }, - usingTestDigiDocService: useTestDDS, andTSUrl: DefaultsHelper.timestampUrl ?? MoppConfiguration.getMoppLibConfiguration().tsaurl, withMoppConfiguration: MoppConfiguration.getMoppLibConfiguration(), andProxyConfiguration: ManualProxy.getMoppLibProxyConfiguration() diff --git a/MoppApp/MoppApp/MobileIDSignature.swift b/MoppApp/MoppApp/MobileIDSignature.swift index 33d7d0c97..d3cad0a70 100644 --- a/MoppApp/MoppApp/MobileIDSignature.swift +++ b/MoppApp/MoppApp/MobileIDSignature.swift @@ -236,7 +236,7 @@ class MobileIDSignature { "\tCert: \(cert)\n" + "\tSignature value: \(signatureValue)\n" ) - MoppLibManager.isSignatureValid(cert, signatureValue: signatureValue, success: { + MoppLibContainerActions.isSignatureValid(cert, signatureValue: signatureValue, success: { printLog("\nRIA.MobileID - Successfully validated signature!\n") DispatchQueue.main.async { NotificationCenter.default.post( @@ -287,7 +287,7 @@ class MobileIDSignature { // MARK: Get hash private func getHash(cert: Data, containerPath: String, roleData: MoppLibRoleAddressData?) -> Data? { - guard let hash = MoppLibManager.prepareSignature(cert, containerPath: containerPath, roleData: roleData) else { + guard let hash = MoppLibContainerActions.prepareSignature(cert, containerPath: containerPath, roleData: roleData) else { printLog("RIA.MobileID - Failed to get hash:\n" + "\tCert: \(cert)\n" + "\tContainer path: \(containerPath)\n" diff --git a/MoppApp/MoppApp/NFCSignature.swift b/MoppApp/MoppApp/NFCSignature.swift index a57c14e96..9d46315f6 100644 --- a/MoppApp/MoppApp/NFCSignature.swift +++ b/MoppApp/MoppApp/NFCSignature.swift @@ -169,7 +169,7 @@ class NFCSignature : NSObject, NFCTagReaderSessionDelegate { } printLog("Cert reading done") - guard let hash = MoppLibManager.prepareSignature(cert, containerPath: containerPath, roleData: roleInfo) else { + guard let hash = MoppLibContainerActions.prepareSignature(cert, containerPath: containerPath, roleData: roleInfo) else { return setSessionMessage(L(.nfcSignFailed), invalidate: true) } roleInfo = nil @@ -180,7 +180,7 @@ class NFCSignature : NSObject, NFCTagReaderSessionDelegate { _ = try await sendWrapped(tag: tag, cls: 0x00, ins: 0x20, p1: 0x00, p2: 0x85, data: pin) let signatureValue = try await sendWrapped(tag: tag, cls:0x00, ins: 0x2A, p1: 0x9E, p2: 0x9A, data: Bytes(hash), le: 256); printLog("\nRIA.NFC - Validating signature...\n") - MoppLibManager.isSignatureValid(cert, signatureValue: signatureValue, success: { + MoppLibContainerActions.isSignatureValid(cert, signatureValue: signatureValue, success: { printLog("\nRIA.NFC - Successfully validated signature!\n") DispatchQueue.main.asyncAfter(deadline: .now() + 1) { NotificationCenter.default.post( diff --git a/MoppApp/MoppApp/ProxyViewController.swift b/MoppApp/MoppApp/ProxyViewController.swift index 34cefcb91..bebfcdf2f 100644 --- a/MoppApp/MoppApp/ProxyViewController.swift +++ b/MoppApp/MoppApp/ProxyViewController.swift @@ -200,7 +200,7 @@ class ProxyViewController: MoppViewController, URLSessionDelegate { let manualProxyConf = ManualProxy.getManualProxyConfiguration() - let userAgent = MoppLibManager.sharedInstance().userAgent() + let userAgent = MoppLibManager.userAgent() var request = URLRequest(url: url) request.httpMethod = "GET" request.setValue(userAgent, forHTTPHeaderField: "User-Agent") diff --git a/MoppApp/MoppApp/SettingsConfiguration.swift b/MoppApp/MoppApp/SettingsConfiguration.swift index 995a457d6..216ed9053 100644 --- a/MoppApp/MoppApp/SettingsConfiguration.swift +++ b/MoppApp/MoppApp/SettingsConfiguration.swift @@ -229,7 +229,7 @@ class SettingsConfiguration: NSObject, URLSessionDelegate, URLSessionTaskDelegat let urlSession = URLSession(configuration: urlSessionConfiguration, delegate: self, delegateQueue: nil) - let userAgent = MoppLibManager.sharedInstance().userAgent() + let userAgent = MoppLibManager.userAgent() var request = URLRequest(url: url) request.setValue(userAgent, forHTTPHeaderField: "User-Agent") @@ -349,18 +349,12 @@ class SettingsConfiguration: NSObject, URLSessionDelegate, URLSessionTaskDelegat } private func reloadDigiDocConf() { - #if USE_TEST_DDS - let useTestDDS = true - #else - let useTestDDS = false - #endif - - MoppLibManager.sharedInstance()?.setup(success: { + MoppLibContainerActions.setup(success: { printLog("Successfully reloaded DigiDocConf") }, andFailure: { error in printLog("Failed to reload DigiDocConf") fatalError("Failed to reload DigiDocConf") - }, usingTestDigiDocService: useTestDDS, andTSUrl: DefaultsHelper.timestampUrl ?? MoppConfiguration.getMoppLibConfiguration().tsaurl, + }, andTSUrl: DefaultsHelper.timestampUrl ?? MoppConfiguration.getMoppLibConfiguration().tsaurl, withMoppConfiguration: MoppConfiguration.getMoppLibConfiguration(), andProxyConfiguration: ManualProxy.getMoppLibProxyConfiguration()) } diff --git a/MoppApp/MoppApp/Signing/SigningCategoryViewController.swift b/MoppApp/MoppApp/Signing/SigningCategoryViewController.swift index ffa06686d..74a69be06 100644 --- a/MoppApp/MoppApp/Signing/SigningCategoryViewController.swift +++ b/MoppApp/MoppApp/Signing/SigningCategoryViewController.swift @@ -348,19 +348,13 @@ extension SigningCategoryViewController: SettingsCellDelegate { extension SigningCategoryViewController: SettingsTimeStampCellDelegate { func didChangeTimestamp(_ fieldId: SigningCategoryViewController.FieldId, with value: String?) { DefaultsHelper.timestampUrl = value - -#if USE_TEST_DDS - let useTestDDS = true -#else - let useTestDDS = false -#endif - MoppLibManager.sharedInstance()?.setup(success: { + MoppLibContainerActions.setup(success: { printLog("success") }, andFailure: { [weak self] error in let nsError = error as? NSError self?.errorAlertWithLink(message: MessageUtil.generateDetailedErrorMessage(error: nsError) ?? L(.genericErrorMessage)) - }, usingTestDigiDocService: useTestDDS, andTSUrl: DefaultsHelper.timestampUrl ?? MoppConfiguration.getMoppLibConfiguration().tsaurl, + }, andTSUrl: DefaultsHelper.timestampUrl ?? MoppConfiguration.getMoppLibConfiguration().tsaurl, withMoppConfiguration: MoppConfiguration.getMoppLibConfiguration(), andProxyConfiguration: ManualProxy.getMoppLibProxyConfiguration()) } diff --git a/MoppApp/MoppApp/SivaUtil.swift b/MoppApp/MoppApp/SivaUtil.swift index efb1a3b49..1e946a8ec 100644 --- a/MoppApp/MoppApp/SivaUtil.swift +++ b/MoppApp/MoppApp/SivaUtil.swift @@ -123,7 +123,6 @@ class SiVaUtil { } static func setIsSentToSiva(isSent: Bool) { - let validateOnlineInstance = MoppLibDigidocValidateOnline.sharedInstance() - validateOnlineInstance?.validateOnline = isSent + MoppLibManager.shared.validateOnline = isSent } } diff --git a/MoppApp/MoppApp/SmartIDSignature.swift b/MoppApp/MoppApp/SmartIDSignature.swift index 28a143c21..2d0f8db9d 100644 --- a/MoppApp/MoppApp/SmartIDSignature.swift +++ b/MoppApp/MoppApp/SmartIDSignature.swift @@ -171,7 +171,7 @@ class SmartIDSignature { private func validateSignature(cert: Data, signatureValue: Data) -> Void { printLog("\nRIA.SmartID - Validating signature...\n") - MoppLibManager.isSignatureValid(cert, signatureValue: signatureValue, success: { + MoppLibContainerActions.isSignatureValid(cert, signatureValue: signatureValue, success: { printLog("\nRIA.SmartID - Successfully validated signature!\n") DispatchQueue.main.async { NotificationCenter.default.post( @@ -208,7 +208,7 @@ class SmartIDSignature { } private func setupControlCode(certificateValue: Data, containerPath: String, roleData: MoppLibRoleAddressData?) -> Data? { - guard let hash = MoppLibManager.prepareSignature(certificateValue, containerPath: containerPath, roleData: roleData) else { + guard let hash = MoppLibContainerActions.prepareSignature(certificateValue, containerPath: containerPath, roleData: roleData) else { return nil } diff --git a/MoppLib/MoppLib.xcodeproj/project.pbxproj b/MoppLib/MoppLib.xcodeproj/project.pbxproj index 09b87e258..5a3423333 100644 --- a/MoppLib/MoppLib.xcodeproj/project.pbxproj +++ b/MoppLib/MoppLib.xcodeproj/project.pbxproj @@ -21,15 +21,12 @@ 546E57631E2E07C7009A568D /* MoppLib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4250CE71E09695100530370 /* MoppLib.framework */; }; 546E576B1E2E1555009A568D /* MoppLibPinActions+Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 546E576A1E2E1555009A568D /* MoppLibPinActions+Tests.m */; }; 54D164771E9269C50069C725 /* MoppLibContainerActions.h in Headers */ = {isa = PBXBuildFile; fileRef = 54D164751E9269C50069C725 /* MoppLibContainerActions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 54D164781E9269C50069C725 /* MoppLibContainerActions.m in Sources */ = {isa = PBXBuildFile; fileRef = 54D164761E9269C50069C725 /* MoppLibContainerActions.m */; }; + 54D164781E9269C50069C725 /* MoppLibContainerActions.mm in Sources */ = {isa = PBXBuildFile; fileRef = 54D164761E9269C50069C725 /* MoppLibContainerActions.mm */; }; 54D1647C1E926AAB0069C725 /* MoppLibCardActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54D1647A1E926AAB0069C725 /* MoppLibCardActions.swift */; }; 54D1FF731E4CB6AD006BF123 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 54D1FF751E4CB6AD006BF123 /* Localizable.strings */; }; 54DC0DC91E0BCCEF00C62B3D /* MoppLibConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 54DC0DC71E0BCCEF00C62B3D /* MoppLibConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; 54DC0E021E0D48C900C62B3D /* MoppLibError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DC0E001E0D48C900C62B3D /* MoppLibError.swift */; }; - 54E085EA1E71A63C00431F1A /* Reachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 54E085E81E71A63C00431F1A /* Reachability.h */; }; - 54E085EB1E71A63C00431F1A /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 54E085E91E71A63C00431F1A /* Reachability.m */; }; - 54E1DB5C1E44A9060060A250 /* MoppLibManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 54E1DB5A1E44A9060060A250 /* MoppLibManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 54E1DB5D1E44A9060060A250 /* MoppLibManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 54E1DB5B1E44A9060060A250 /* MoppLibManager.m */; }; + 54E1DB5D1E44A9060060A250 /* MoppLibManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E1DB5B1E44A9060060A250 /* MoppLibManager.swift */; }; C54EA73020499DFC0039AC78 /* ExternalAccessory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C54EA72F20499DFC0039AC78 /* ExternalAccessory.framework */; }; C54EA732204D5E860039AC78 /* CardReaderiR301.swift in Sources */ = {isa = PBXBuildFile; fileRef = C54EA731204D5E860039AC78 /* CardReaderiR301.swift */; }; C54EA738204D91730039AC78 /* MoppLibCardReaderManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C54EA737204D91730039AC78 /* MoppLibCardReaderManager.swift */; }; @@ -41,8 +38,6 @@ C5E41C5E2180602B00D79B54 /* Idemia.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5E41C5C2180602B00D79B54 /* Idemia.swift */; }; C5F462A8209727E8001B7D59 /* CoreBluetooth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5F462A7209727E8001B7D59 /* CoreBluetooth.framework */; }; DF1503872AC5CE32007222B2 /* OCMock in Frameworks */ = {isa = PBXBuildFile; productRef = DF1503862AC5CE32007222B2 /* OCMock */; }; - DF169D5A2B9000F0000DD46C /* MoppLibDigidocValidateOnline.h in Headers */ = {isa = PBXBuildFile; fileRef = DF169D592B9000F0000DD46C /* MoppLibDigidocValidateOnline.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DF169D5C2B90011E000DD46C /* MoppLibDigidocValidateOnline.m in Sources */ = {isa = PBXBuildFile; fileRef = DF169D5B2B90011E000DD46C /* MoppLibDigidocValidateOnline.m */; }; DFBDF1F827DA44BD00A5CF3C /* MoppLibRoleAddressData.h in Headers */ = {isa = PBXBuildFile; fileRef = DFBDF1F727DA44BD00A5CF3C /* MoppLibRoleAddressData.h */; settings = {ATTRIBUTES = (Public, ); }; }; DFBDF1FA27DA44FD00A5CF3C /* MoppLibRoleAddressData.m in Sources */ = {isa = PBXBuildFile; fileRef = DFBDF1F927DA44FD00A5CF3C /* MoppLibRoleAddressData.m */; }; DFDD76292B507EFF0008EC2C /* MoppLibProxyConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = DFDD76282B507EFF0008EC2C /* MoppLibProxyConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -89,7 +84,7 @@ 546E57691E2E1555009A568D /* MoppLibPinActions+Tests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MoppLibPinActions+Tests.h"; sourceTree = ""; }; 546E576A1E2E1555009A568D /* MoppLibPinActions+Tests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MoppLibPinActions+Tests.m"; sourceTree = ""; }; 54D164751E9269C50069C725 /* MoppLibContainerActions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MoppLibContainerActions.h; sourceTree = ""; }; - 54D164761E9269C50069C725 /* MoppLibContainerActions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MoppLibContainerActions.m; sourceTree = ""; }; + 54D164761E9269C50069C725 /* MoppLibContainerActions.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MoppLibContainerActions.mm; sourceTree = ""; }; 54D1647A1E926AAB0069C725 /* MoppLibCardActions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoppLibCardActions.swift; sourceTree = ""; }; 54D1FF741E4CB6AD006BF123 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 54D1FF761E4CB6C8006BF123 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; @@ -98,10 +93,7 @@ 54DC0DC31E0BCC2A00C62B3D /* CardReaderWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardReaderWrapper.swift; sourceTree = ""; }; 54DC0DC71E0BCCEF00C62B3D /* MoppLibConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MoppLibConstants.h; sourceTree = ""; }; 54DC0E001E0D48C900C62B3D /* MoppLibError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoppLibError.swift; sourceTree = ""; }; - 54E085E81E71A63C00431F1A /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = ""; }; - 54E085E91E71A63C00431F1A /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = ""; }; - 54E1DB5A1E44A9060060A250 /* MoppLibManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MoppLibManager.h; sourceTree = ""; }; - 54E1DB5B1E44A9060060A250 /* MoppLibManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MoppLibManager.m; sourceTree = ""; }; + 54E1DB5B1E44A9060060A250 /* MoppLibManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoppLibManager.swift; sourceTree = ""; }; C54EA72F20499DFC0039AC78 /* ExternalAccessory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ExternalAccessory.framework; path = System/Library/Frameworks/ExternalAccessory.framework; sourceTree = SDKROOT; }; C54EA731204D5E860039AC78 /* CardReaderiR301.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardReaderiR301.swift; sourceTree = ""; }; C54EA737204D91730039AC78 /* MoppLibCardReaderManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoppLibCardReaderManager.swift; sourceTree = ""; }; @@ -112,8 +104,6 @@ C5AAAF8920CAA4790087D6DA /* ft301u.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ft301u.h; sourceTree = ""; }; C5E41C5C2180602B00D79B54 /* Idemia.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Idemia.swift; sourceTree = ""; }; C5F462A7209727E8001B7D59 /* CoreBluetooth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreBluetooth.framework; path = System/Library/Frameworks/CoreBluetooth.framework; sourceTree = SDKROOT; }; - DF169D592B9000F0000DD46C /* MoppLibDigidocValidateOnline.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MoppLibDigidocValidateOnline.h; sourceTree = ""; }; - DF169D5B2B90011E000DD46C /* MoppLibDigidocValidateOnline.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MoppLibDigidocValidateOnline.m; sourceTree = ""; }; DFBDF1F727DA44BD00A5CF3C /* MoppLibRoleAddressData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MoppLibRoleAddressData.h; sourceTree = ""; }; DFBDF1F927DA44FD00A5CF3C /* MoppLibRoleAddressData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MoppLibRoleAddressData.m; sourceTree = ""; }; DFDD76282B507EFF0008EC2C /* MoppLibProxyConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MoppLibProxyConfiguration.h; sourceTree = ""; }; @@ -176,12 +166,11 @@ children = ( 54D1647D1E926BA00069C725 /* ResponseObjects */, E4250CEA1E09695100530370 /* MoppLib.h */, - 54E1DB5A1E44A9060060A250 /* MoppLibManager.h */, - 54E1DB5B1E44A9060060A250 /* MoppLibManager.m */, + 54E1DB5B1E44A9060060A250 /* MoppLibManager.swift */, 54D1647A1E926AAB0069C725 /* MoppLibCardActions.swift */, C54EA737204D91730039AC78 /* MoppLibCardReaderManager.swift */, 54D164751E9269C50069C725 /* MoppLibContainerActions.h */, - 54D164761E9269C50069C725 /* MoppLibContainerActions.m */, + 54D164761E9269C50069C725 /* MoppLibContainerActions.mm */, 399C01E120BC0EF30056D7AC /* MoppLibCryptoActions.h */, 399C01E220BC11C20056D7AC /* MoppLibCryptoActions.m */, 542DCB6B1E23968000899534 /* MoppLibPinActions.swift */, @@ -189,8 +178,6 @@ 54DC0E001E0D48C900C62B3D /* MoppLibError.swift */, DFDD76282B507EFF0008EC2C /* MoppLibProxyConfiguration.h */, DFDD762A2B507F9E0008EC2C /* MoppLibProxyConfiguration.m */, - DF169D592B9000F0000DD46C /* MoppLibDigidocValidateOnline.h */, - DF169D5B2B90011E000DD46C /* MoppLibDigidocValidateOnline.m */, ); name = PublicInterface; path = MoppLib/PublicInterface; @@ -233,16 +220,6 @@ name = CardActions; sourceTree = ""; }; - 54E085E71E71A61900431F1A /* Reachability */ = { - isa = PBXGroup; - children = ( - 54E085E81E71A63C00431F1A /* Reachability.h */, - 54E085E91E71A63C00431F1A /* Reachability.m */, - ); - name = Reachability; - path = MoppLib/Reachability; - sourceTree = ""; - }; A80A16CFB65AE0AF2A553445 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -280,7 +257,6 @@ E4250CDD1E09695100530370 = { isa = PBXGroup; children = ( - 54E085E71E71A61900431F1A /* Reachability */, 54D1FF821E4DA075006BF123 /* PrefixHeader.pch */, 54D1FF751E4CB6AD006BF123 /* Localizable.strings */, 54D164741E9269520069C725 /* PublicInterface */, @@ -329,16 +305,13 @@ DFF3C3A923322E0D0079458A /* MoppLibConfiguration.h in Headers */, E42B08C51E1F11B900EA24A3 /* MoppLibDataFile.h in Headers */, 399C01E620BC17A10056D7AC /* MoppLibCryptoActions.h in Headers */, - 54E1DB5C1E44A9060060A250 /* MoppLibManager.h in Headers */, E42B08CD1E1F136A00EA24A3 /* MoppLibDigidocManager.h in Headers */, 54DC0DC91E0BCCEF00C62B3D /* MoppLibConstants.h in Headers */, 54D164771E9269C50069C725 /* MoppLibContainerActions.h in Headers */, E42B08B51E1F0B3B00EA24A3 /* MoppLibContainer.h in Headers */, E42B08C91E1F11C100EA24A3 /* MoppLibSignature.h in Headers */, - 54E085EA1E71A63C00431F1A /* Reachability.h in Headers */, E4250CEC1E09695100530370 /* MoppLib.h in Headers */, C5AAAF8420CAA3D00087D6DA /* ReaderInterface.h in Headers */, - DF169D5A2B9000F0000DD46C /* MoppLibDigidocValidateOnline.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -464,14 +437,13 @@ 4E0053842D7DEE8B00B1AFE5 /* CardCommands.swift in Sources */, 4ECAD7B42D7DAFA800B02E0F /* CardReaderWrapper.swift in Sources */, DFBDF1FA27DA44FD00A5CF3C /* MoppLibRoleAddressData.m in Sources */, - 54E1DB5D1E44A9060060A250 /* MoppLibManager.m in Sources */, + 54E1DB5D1E44A9060060A250 /* MoppLibManager.swift in Sources */, E42B08CE1E1F136A00EA24A3 /* MoppLibDigidocManager.mm in Sources */, E485A7841E2DF58200C53DBF /* MLFileManager.m in Sources */, E42B08B61E1F0B3B00EA24A3 /* MoppLibContainer.m in Sources */, 54D1647C1E926AAB0069C725 /* MoppLibCardActions.swift in Sources */, E42B08CA1E1F11C100EA24A3 /* MoppLibSignature.m in Sources */, DFDD762B2B507F9E0008EC2C /* MoppLibProxyConfiguration.m in Sources */, - DF169D5C2B90011E000DD46C /* MoppLibDigidocValidateOnline.m in Sources */, 399C01E320BC11C20056D7AC /* MoppLibCryptoActions.m in Sources */, C5E41C5E2180602B00D79B54 /* Idemia.swift in Sources */, 39266A5320CFC0F4002E3F23 /* SmartToken.swift in Sources */, @@ -482,8 +454,7 @@ 54DC0E021E0D48C900C62B3D /* MoppLibError.swift in Sources */, E42B08C61E1F11B900EA24A3 /* MoppLibDataFile.m in Sources */, C54EA738204D91730039AC78 /* MoppLibCardReaderManager.swift in Sources */, - 54E085EB1E71A63C00431F1A /* Reachability.m in Sources */, - 54D164781E9269C50069C725 /* MoppLibContainerActions.m in Sources */, + 54D164781E9269C50069C725 /* MoppLibContainerActions.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MoppLib/MoppLib/MoppLibDigidocManager.h b/MoppLib/MoppLib/MoppLibDigidocManager.h index d5d4240c7..66cae2dfd 100644 --- a/MoppLib/MoppLib/MoppLibDigidocManager.h +++ b/MoppLib/MoppLib/MoppLibDigidocManager.h @@ -28,17 +28,10 @@ @class MoppLibRoleAddressData; @class MoppLibSignature; -typedef enum { - Unspecified, - TimeStamp, - TimeMark -} SigningProfileType; - @interface MoppLibDigidocManager : NSObject -@property (readonly) BOOL useTestDigiDocService; + (MoppLibDigidocManager *)sharedInstance; -- (void)setupWithSuccess:(VoidBlock)success andFailure:(FailureBlock)failure usingTestDigiDocService:(BOOL)useTestDDS andTSUrl:(NSString*)tsUrl withMoppConfiguration:(MoppLibConfiguration*)moppConfiguration andProxyConfiguration:(MoppLibProxyConfiguration*)proxyConfiguration; +- (void)setupWithSuccess:(VoidBlock)success andFailure:(FailureBlock)failure andTSUrl:(NSString*)tsUrl withMoppConfiguration:(MoppLibConfiguration*)moppConfiguration andProxyConfiguration:(MoppLibProxyConfiguration*)proxyConfiguration; - (MoppLibContainer *)getContainerWithPath:(NSString *)containerPath error:(NSError **)error; - (MoppLibContainer *)createContainerWithPath:(NSString *)containerPath withDataFilePaths:(NSArray *)dataFilePaths error:(NSError **)error; @@ -51,9 +44,4 @@ typedef enum { - (MoppLibContainer *)removeSignature:(MoppLibSignature *)moppSignature fromContainerWithPath:(NSString *)containerPath error:(NSError **)error; - (void)container:(NSString *)containerPath saveDataFile:(NSString *)fileName to:(NSString *)path success:(VoidBlock)success failure:(FailureBlock)failure; - (BOOL)isContainerFileSaveable:(NSString *)containerPath saveDataFile:(NSString *)fileName; -- (NSString *)digidocVersion; -- (NSString *)moppAppVersion; -- (NSString *)iOSVersion; -- (NSString *)userAgent; -- (NSString *)userAgent:(BOOL)shouldIncludeDevices; @end diff --git a/MoppLib/MoppLib/MoppLibDigidocManager.mm b/MoppLib/MoppLib/MoppLibDigidocManager.mm index 550231912..f392e0712 100644 --- a/MoppLib/MoppLib/MoppLibDigidocManager.mm +++ b/MoppLib/MoppLib/MoppLibDigidocManager.mm @@ -25,8 +25,6 @@ #import "MoppLibConfiguration.h" #import "MoppLibContainer.h" #import "MoppLibDataFile.h" -#import "MoppLibDigidocValidateOnline.h" -#import "MoppLibManager.h" #import "MoppLibProxyConfiguration.h" #import "MoppLibRoleAddressData.h" #import "MoppLibSignature.h" @@ -42,8 +40,6 @@ #include #include -#import -#import class DigiDocConf: public digidoc::ConfCurrent { @@ -285,7 +281,7 @@ + (MoppLibDigidocManager *)sharedInstance { return sharedInstance; } -- (void)setupWithSuccess:(VoidBlock)success andFailure:(FailureBlock)failure usingTestDigiDocService:(BOOL)useTestDDS andTSUrl:(NSString*)tsUrl withMoppConfiguration:(MoppLibConfiguration*)moppConfiguration andProxyConfiguration:(MoppLibProxyConfiguration*)proxyConfiguration { +- (void)setupWithSuccess:(VoidBlock)success andFailure:(FailureBlock)failure andTSUrl:(NSString*)tsUrl withMoppConfiguration:(MoppLibConfiguration*)moppConfiguration andProxyConfiguration:(MoppLibProxyConfiguration*)proxyConfiguration { dispatch_async(dispatch_get_main_queue(), ^{ dispatch_semaphore_t sem = dispatch_semaphore_create(0); @@ -296,9 +292,8 @@ - (void)setupWithSuccess:(VoidBlock)success andFailure:(FailureBlock)failure usi [moppConfiguration.TSAURL cStringUsingEncoding:NSUTF8StringEncoding] : [tsUrl cStringUsingEncoding:NSUTF8StringEncoding]; digidoc::Conf::init(new DigiDocConf(timestampUrl, moppConfiguration, proxyConfiguration)); - NSString *appInfo = [self userAgent]; - std::string appInfoObjcString = std::string([appInfo UTF8String]); - digidoc::initialize(appInfoObjcString, appInfoObjcString); + std::string appInfo = MoppLibManager.userAgent.UTF8String; + digidoc::initialize(appInfo, appInfo); dispatch_semaphore_signal(sem); @@ -367,10 +362,11 @@ + (void)isSignatureValid:(NSData *)cert signatureValue:(NSData *)data success:(V + (void)removeSignature:(digidoc::Container *)container signatureId:(NSString *)signatureId error:(NSError **)error { + const char *signatureIdUTF8 = signatureId.UTF8String; for (int i = 0; i < container->signatures().size(); i++) { digidoc::Signature *signature = container->signatures().at(i); try { - if ([NSString stringWithUTF8String:signature->id().c_str()] == signatureId) { + if (signature->id() == signatureIdUTF8) { container->removeSignature(i); container->save(); break; @@ -398,9 +394,7 @@ + (NSData *)prepareSignature:(NSData *)cert containerPath:(NSString *)containerP signer = std::make_unique(x509Cert); try { - MoppLibDigidocValidateOnline *validateOnlineInstance = [MoppLibDigidocValidateOnline sharedInstance]; - BOOL isValidatedOnline = validateOnlineInstance.validateOnline; - MoppLibDigidocContainerOpenCB cb(isValidatedOnline); + MoppLibDigidocContainerOpenCB cb(MoppLibManager.shared.validateOnline); docContainer = digidoc::Container::openPtr(containerPath.UTF8String, &cb); } catch(const digidoc::Exception &e) { parseException(e); @@ -411,8 +405,8 @@ + (NSData *)prepareSignature:(NSData *)cert containerPath:(NSString *)containerP NSLog(@"Role data - roles: %@, city: %@, state: %@, zip: %@, country: %@", roleData.ROLES, roleData.CITY, roleData.STATE, roleData.ZIP, roleData.COUNTRY); signer->setProfile("time-stamp"); signer->setSignatureProductionPlace(std::string([roleData.CITY UTF8String] ?: ""), std::string([roleData.STATE UTF8String] ?: ""), std::string([roleData.ZIP UTF8String] ?: ""), std::string([roleData.COUNTRY UTF8String] ?: "")); - signer->setUserAgent(std::string([MoppLibManager.sharedInstance.userAgent UTF8String])); - + signer->setUserAgent(MoppLibManager.userAgent.UTF8String); + std::vector roles; for (NSString *role in roleData.ROLES) { if (role != (id)[NSNull null] && [role length] != 0) { @@ -425,8 +419,7 @@ + (NSData *)prepareSignature:(NSData *)cert containerPath:(NSString *)containerP NSLog(@"\nSetting signature...\n"); signature = docContainer->prepareSignature(signer.get()); - NSString *signatureId = [NSString stringWithCString:signature->id().c_str() encoding:[NSString defaultCStringEncoding]]; - printLog(@"\nSignature ID set to %@...\n", signatureId); + printLog(@"\nSignature ID set to %s...\n", signature->id().c_str()); std::vector dataToSign = signature->dataToSign(); return [NSData dataWithBytes:dataToSign.data() length:dataToSign.size()]; @@ -444,9 +437,7 @@ - (MoppLibContainer *)getContainerWithPath:(NSString *)containerPath error:(NSEr std::unique_ptr doc; try { - MoppLibDigidocValidateOnline *validateOnlineInstance = [MoppLibDigidocValidateOnline sharedInstance]; - BOOL isValidatedOnline = validateOnlineInstance.validateOnline; - MoppLibDigidocContainerOpenCB cb(isValidatedOnline); + MoppLibDigidocContainerOpenCB cb(MoppLibManager.shared.validateOnline); doc = digidoc::Container::openPtr(containerPath.UTF8String, &cb); } catch(const digidoc::Exception &e) { parseException(e); @@ -632,9 +623,7 @@ - (MoppLibContainer *)createContainerWithPath:(NSString *)containerPath withData - (MoppLibContainer *)addDataFilesToContainerWithPath:(NSString *)containerPath withDataFilePaths:(NSArray *)dataFilePaths error:(NSError **)error { try { - MoppLibDigidocValidateOnline *validateOnlineInstance = [MoppLibDigidocValidateOnline sharedInstance]; - BOOL isValidatedOnline = validateOnlineInstance.validateOnline; - MoppLibDigidocContainerOpenCB cb(isValidatedOnline); + MoppLibDigidocContainerOpenCB cb(MoppLibManager.shared.validateOnline); auto container = digidoc::Container::openPtr(containerPath.UTF8String, &cb); for (NSString *dataFilePath in dataFilePaths) { @@ -673,9 +662,7 @@ - (void)addDataFileToContainer:(digidoc::Container *)container withDataFilePath: - (MoppLibContainer *)removeDataFileFromContainerWithPath:(NSString *)containerPath atIndex:(NSUInteger)dataFileIndex error:(NSError **)error { try { - MoppLibDigidocValidateOnline *validateOnlineInstance = [MoppLibDigidocValidateOnline sharedInstance]; - BOOL isValidatedOnline = validateOnlineInstance.validateOnline; - MoppLibDigidocContainerOpenCB cb(isValidatedOnline); + MoppLibDigidocContainerOpenCB cb(MoppLibManager.shared.validateOnline); auto container = digidoc::Container::openPtr(containerPath.UTF8String, &cb); container->removeDataFile((int)dataFileIndex); container->save(containerPath.UTF8String); @@ -712,9 +699,7 @@ - (void)addSignature:(NSString *)containerPath pin2:(NSString *)pin2 cert:(NSDat try { // Load the container - MoppLibDigidocValidateOnline *validateOnlineInstance = [MoppLibDigidocValidateOnline sharedInstance]; - BOOL isValidatedOnline = validateOnlineInstance.validateOnline; - MoppLibDigidocContainerOpenCB cb(isValidatedOnline); + MoppLibDigidocContainerOpenCB cb(MoppLibManager.shared.validateOnline); // Create unique_ptr that manages a container in this scope auto container = digidoc::Container::openPtr(containerPath.UTF8String, &cb); WebSigner signer([MoppLibDigidocManager getCertFromData:cert]); @@ -723,7 +708,7 @@ - (void)addSignature:(NSString *)containerPath pin2:(NSString *)pin2 cert:(NSDat NSLog(@"Role data - roles: %@, city: %@, state: %@, zip: %@, country: %@", roleData.ROLES, roleData.CITY, roleData.STATE, roleData.ZIP, roleData.COUNTRY); signer.setProfile("time-stamp"); signer.setSignatureProductionPlace(std::string([roleData.CITY UTF8String] ?: ""), std::string([roleData.STATE UTF8String] ?: ""), std::string([roleData.ZIP UTF8String] ?: ""), std::string([roleData.COUNTRY UTF8String] ?: "")); - signer.setUserAgent(std::string([[MoppLibManager.sharedInstance userAgent:true] UTF8String])); + signer.setUserAgent([MoppLibManager userAgent:true].UTF8String); std::vector roles; for (NSString *role in roleData.ROLES) { @@ -773,9 +758,7 @@ - (void)addSignature:(NSString *)containerPath pin2:(NSString *)pin2 cert:(NSDat } - (MoppLibContainer *)removeSignature:(MoppLibSignature *)moppSignature fromContainerWithPath:(NSString *)containerPath error:(NSError **)error { - MoppLibDigidocValidateOnline *validateOnlineInstance = [MoppLibDigidocValidateOnline sharedInstance]; - BOOL isValidatedOnline = validateOnlineInstance.validateOnline; - MoppLibDigidocContainerOpenCB cb(isValidatedOnline); + MoppLibDigidocContainerOpenCB cb(MoppLibManager.shared.validateOnline); auto doc = digidoc::Container::openPtr(containerPath.UTF8String, &cb); for (int i = 0; i < doc->signatures().size(); i++) { digidoc::Signature *signature = doc->signatures().at(i); @@ -819,12 +802,11 @@ - (NSString *)trimWhitespace:(NSString *)text { - (void)container:(NSString *)containerPath saveDataFile:(NSString *)fileName to:(NSString *)path success:(VoidBlock)success failure:(FailureBlock)failure { try { - MoppLibDigidocValidateOnline *validateOnlineInstance = [MoppLibDigidocValidateOnline sharedInstance]; - BOOL isValidatedOnline = validateOnlineInstance.validateOnline; - MoppLibDigidocContainerOpenCB cb(isValidatedOnline); + MoppLibDigidocContainerOpenCB cb(MoppLibManager.shared.validateOnline); if (auto doc = digidoc::Container::openPtr(containerPath.UTF8String, &cb)) { + const char *fileNameUTF8 = fileName.UTF8String; for (digidoc::DataFile *dataFile: doc->dataFiles()) { - if ([self isFileInContainer:fileName dataFile:[NSString stringWithUTF8String:dataFile->fileName().c_str()]]) { + if (dataFile->fileName() == fileNameUTF8) { dataFile->saveAs(path.UTF8String); success(); return; @@ -841,18 +823,13 @@ - (void)container:(NSString *)containerPath saveDataFile:(NSString *)fileName to failure([MoppLibError generalError]); } --(BOOL)isFileInContainer:(NSString *)fileName dataFile:(NSString *)dataFileName { - return [fileName isEqualToString:dataFileName]; -} - - (BOOL)isContainerFileSaveable:(NSString *)containerPath saveDataFile:(NSString *)fileName { try { - MoppLibDigidocValidateOnline *validateOnlineInstance = [MoppLibDigidocValidateOnline sharedInstance]; - BOOL isValidatedOnline = validateOnlineInstance.validateOnline; - MoppLibDigidocContainerOpenCB cb(isValidatedOnline); + MoppLibDigidocContainerOpenCB cb(MoppLibManager.shared.validateOnline); if (auto doc = digidoc::Container::openPtr(containerPath.UTF8String, &cb)) { + const char *fileNameUTF8 = fileName.UTF8String; for (digidoc::DataFile *dataFile: doc->dataFiles()) { - if([self isFileInContainer:fileName dataFile:[NSString stringWithUTF8String:dataFile->fileName().c_str()]]) { + if(dataFile->fileName() == fileNameUTF8) { return TRUE; } } @@ -863,59 +840,4 @@ - (BOOL)isContainerFileSaveable:(NSString *)containerPath saveDataFile:(NSString return FALSE; } -- (NSString *)digidocVersion { - std::string version = digidoc::version(); - return [[NSString alloc] initWithBytes:version.c_str() length:version.length() encoding:NSUTF8StringEncoding]; -} - -- (NSString *)moppAppVersion { - NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"]; - NSString * build = [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey]; - return [NSString stringWithFormat:@"%@.%@", version, build]; -} - -- (NSString *)iOSVersion { - return [[UIDevice currentDevice] systemVersion]; -} - -- (NSString *)appLanguage { - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSString *language = [defaults stringForKey:@"kMoppLanguage"]; - return [language length] != 0 ? [NSString stringWithFormat:@"%@", language] : [NSString stringWithFormat:@"%s", "N/A"]; -} - -- (NSArray *)connectedDevices { - EAAccessoryManager* accessoryManager = [EAAccessoryManager sharedAccessoryManager]; - NSMutableArray *devices = [NSMutableArray new]; - if (accessoryManager) { - NSArray *connectedAccessories = [accessoryManager connectedAccessories]; - for (int i = 0; i < connectedAccessories.count; i++) { - EAAccessory *device = connectedAccessories[i]; - NSString *manufacturer = device.manufacturer; - NSString *name = device.name; - NSString *modelNumber = device.modelNumber; - NSString *deviceName = [NSString stringWithFormat:@"%@ %@ (%@)", manufacturer, name, modelNumber]; - [devices addObject:deviceName]; - } - return [devices copy]; - } - - return [devices copy]; -} - -- (NSString *)userAgent { - return [self userAgent:false]; -} - -- (NSString *)userAgent:(BOOL)shouldIncludeDevices { - NSString *appInfo = [NSString stringWithFormat:@"%s/%@ (iOS %@) Lang: %@", "riadigidoc", [self moppAppVersion], [self iOSVersion], [self appLanguage]]; - if (shouldIncludeDevices) { - NSArray *connectedDevices = [self connectedDevices]; - if (connectedDevices.count > 0) { - appInfo = [NSString stringWithFormat:@"%@ Devices: %@", appInfo, [connectedDevices componentsJoinedByString:@", "]]; - } - } - return appInfo; -} - @end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLib.h b/MoppLib/MoppLib/PublicInterface/MoppLib.h index 560cc26c9..e9a640aeb 100644 --- a/MoppLib/MoppLib/PublicInterface/MoppLib.h +++ b/MoppLib/MoppLib/PublicInterface/MoppLib.h @@ -30,7 +30,6 @@ FOUNDATION_EXPORT double MoppLibVersionNumber; FOUNDATION_EXPORT const unsigned char MoppLibVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import -#import #import #import #import @@ -38,5 +37,4 @@ FOUNDATION_EXPORT const unsigned char MoppLibVersionString[]; #import #import #import -#import #import diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.h b/MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.h index 55003c042..dc171eb1b 100644 --- a/MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.h +++ b/MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.h @@ -26,10 +26,23 @@ #import "MoppLibConstants.h" #import "MoppLibRoleAddressData.h" +@class MoppLibConfiguration; +@class MoppLibProxyConfiguration; + @interface MoppLibContainerActions : NSObject + (MoppLibContainerActions *)sharedInstance; ++ (NSString *)libdigidocppVersion; + +/** + * Prepares library for operations with containers. Setup must be completed before any container action is carried out. It is recommended, that you initiate setup at earliest opportunity. + * + * @param success Block to be called on successful completion of action. + * @param failure Block to be called when action fails. Includes error. + */ ++ (void)setupWithSuccess:(VoidBlock)success andFailure:(FailureBlock)failure andTSUrl:(NSString *)tsUrl withMoppConfiguration:(MoppLibConfiguration *)moppConfiguration andProxyConfiguration:(MoppLibProxyConfiguration*)proxyConfiguration; + /** * Opens container at specified path. * @@ -126,6 +139,7 @@ */ - (void)addSignature:(NSString *)containerPath withPin2:(NSString*)pin2 roleData:(MoppLibRoleAddressData *)roleData success:(ContainerBlock)success failure:(FailureBlock)failure; - ++ (NSData *)prepareSignature:(NSData *)cert containerPath:(NSString *)containerPath roleData:(MoppLibRoleAddressData *)roleData; ++ (void)isSignatureValid:(NSData *)cert signatureValue:(NSData *)signatureValue success:(VoidBlock)success failure:(FailureBlock)failure; @end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.m b/MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.mm similarity index 79% rename from MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.m rename to MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.mm index 144cc7fd1..a46551b9b 100644 --- a/MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.m +++ b/MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.mm @@ -23,11 +23,21 @@ #import "MoppLibContainerActions.h" #import "MoppLibDigidocManager.h" -#import "Reachability.h" +#import #import +#include + @implementation MoppLibContainerActions ++ (void)setupWithSuccess:(VoidBlock)success andFailure:(FailureBlock)failure andTSUrl:(NSString *)tsUrl withMoppConfiguration:(MoppLibConfiguration *)moppConfiguration andProxyConfiguration:(MoppLibProxyConfiguration*)proxyConfiguration { + [[MoppLibDigidocManager sharedInstance] setupWithSuccess:success andFailure:failure andTSUrl:tsUrl withMoppConfiguration: moppConfiguration andProxyConfiguration: proxyConfiguration]; +} + ++ (NSString *)libdigidocppVersion { + return [NSString stringWithUTF8String:digidoc::version().c_str()]; +} + + (MoppLibContainerActions *)sharedInstance { static dispatch_once_t pred; static MoppLibContainerActions *sharedInstance = nil; @@ -38,7 +48,7 @@ + (MoppLibContainerActions *)sharedInstance { } - (void)openContainerWithPath:(NSString *)containerPath success:(ContainerBlock)success failure:(FailureBlock)failure { - + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSError *error; MoppLibContainer *container = [[MoppLibDigidocManager sharedInstance] getContainerWithPath:containerPath error:&error]; @@ -85,9 +95,9 @@ - (void)removeDataFileFromContainerWithPath:(NSString *)containerPath atIndex:(N } -- (void)getContainersWithSuccess:(void(^)(NSArray *containers))success failure:(FailureBlock)failure { +- (void)getContainersWithSuccess:(void(^)(NSArray *containers))success failure:(FailureBlock)failure { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - NSArray *containers = [[MoppLibDigidocManager sharedInstance] getContainers]; + NSArray *containers = [[MoppLibDigidocManager sharedInstance] getContainers]; dispatch_async(dispatch_get_main_queue(), ^{ success(containers); }); @@ -123,11 +133,9 @@ - (BOOL)isContainerFileSaveable:(NSString *)containerPath saveDataFile:(NSString return [[MoppLibDigidocManager sharedInstance] isContainerFileSaveable:containerPath saveDataFile:fileName]; } -- (void)addSignature:(NSString *)containerPath withPin2:(NSString*)pin2 roleData:(MoppLibRoleAddressData *)roleData success:(void(^)(MoppLibContainer *container))success failure:(FailureBlock)failure { +- (void)addSignature:(NSString *)containerPath withPin2:(NSString*)pin2 roleData:(MoppLibRoleAddressData *)roleData success:(ContainerBlock)success failure:(FailureBlock)failure { - Reachability *reachability = [Reachability reachabilityForInternetConnection]; - NetworkStatus networkStatus = [reachability currentReachabilityStatus]; - if (networkStatus == NotReachable) { + if (!MoppLibManager.shared.isConnected) { failure([MoppLibError noInternetConnectionError]); return; } @@ -144,4 +152,12 @@ - (void)addSignature:(NSString *)containerPath withPin2:(NSString*)pin2 roleData }); } ++ (NSData *)prepareSignature:(NSData *)cert containerPath:(NSString *)containerPath roleData:(MoppLibRoleAddressData *)roleData { + return [MoppLibDigidocManager prepareSignature:cert containerPath:containerPath roleData:roleData]; +} + ++ (void)isSignatureValid:(NSData *)cert signatureValue:(NSData *)signatureValue success:(VoidBlock)success failure:(FailureBlock)failure { + return [MoppLibDigidocManager isSignatureValid:cert signatureValue:signatureValue success:success failure:failure]; +} + @end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibDigidocValidateOnline.h b/MoppLib/MoppLib/PublicInterface/MoppLibDigidocValidateOnline.h deleted file mode 100644 index 16ed7354e..000000000 --- a/MoppLib/MoppLib/PublicInterface/MoppLibDigidocValidateOnline.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// MoppLibDigidocValidateOnline.h -// MoppLib -// -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import - -@interface MoppLibDigidocValidateOnline : NSObject - -@property(nonatomic, assign) BOOL validateOnline; - -+ (MoppLibDigidocValidateOnline *)sharedInstance; - -@end - diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibDigidocValidateOnline.m b/MoppLib/MoppLib/PublicInterface/MoppLibDigidocValidateOnline.m deleted file mode 100644 index 026cd646d..000000000 --- a/MoppLib/MoppLib/PublicInterface/MoppLibDigidocValidateOnline.m +++ /dev/null @@ -1,39 +0,0 @@ -// -// MoppLibDigidocValidateOnline.m -// MoppLib -// -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import - -#import "MoppLibDigidocValidateOnline.h" - -@implementation MoppLibDigidocValidateOnline - -+ (MoppLibDigidocValidateOnline *)sharedInstance { - static MoppLibDigidocValidateOnline *sharedInstance = nil; - static dispatch_once_t pred; - dispatch_once(&pred, ^{ - sharedInstance = [[self alloc] init]; - }); - return sharedInstance; -} - -@end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibManager.h b/MoppLib/MoppLib/PublicInterface/MoppLibManager.h deleted file mode 100644 index 2e1a5650a..000000000 --- a/MoppLib/MoppLib/PublicInterface/MoppLibManager.h +++ /dev/null @@ -1,52 +0,0 @@ -// -// MoppLibManager.h -// MoppLib -// -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import "MoppLibConstants.h" - -@class MoppLibConfiguration; -@class MoppLibProxyConfiguration; -@class MoppLibRoleAddressData; - -@interface MoppLibManager : NSObject - -+ (MoppLibManager *)sharedInstance; - -/** - * Prepares library for operations with containers. Setup must be completed before any container action is carried out. It is recommended, that you initiate setup at earliest opportunity. - * - * @param success Block to be called on successful completion of action. - * @param failure Block to be called when action fails. Includes error. - */ -- (void)setupWithSuccess:(VoidBlock)success andFailure:(FailureBlock)failure usingTestDigiDocService:(BOOL)useTestDDS andTSUrl:(NSString *)tsUrl withMoppConfiguration:(MoppLibConfiguration *)moppConfiguration andProxyConfiguration:(MoppLibProxyConfiguration*)proxyConfiguration; - -+ (NSData *)prepareSignature:(NSData *)cert containerPath:(NSString *)containerPath roleData:(MoppLibRoleAddressData *)roleData; -+ (void)isSignatureValid:(NSData *)cert signatureValue:(NSData *)signatureValue success:(VoidBlock)success failure:(FailureBlock)failure; - -- (NSString *)libdigidocppVersion; -- (BOOL)isConnected; -- (NSString *)appVersion; -- (NSString *)iOSVersion; -- (NSString *)userAgent; -- (NSString *)userAgent:(BOOL)shouldIncludeDevices; - -@end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibManager.m b/MoppLib/MoppLib/PublicInterface/MoppLibManager.m deleted file mode 100644 index e0cec6923..000000000 --- a/MoppLib/MoppLib/PublicInterface/MoppLibManager.m +++ /dev/null @@ -1,76 +0,0 @@ -// -// MoppLibManager.m -// MoppLib -// -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import "MoppLibManager.h" -#import "MoppLibDigidocManager.h" -#import "../Reachability/Reachability.h" - -@implementation MoppLibManager - -+ (MoppLibManager *)sharedInstance { - static dispatch_once_t pred; - static MoppLibManager *sharedInstance = nil; - dispatch_once(&pred, ^{ - sharedInstance = [[self alloc] init]; - }); - return sharedInstance; -} - -- (void)setupWithSuccess:(VoidBlock)success andFailure:(FailureBlock)failure usingTestDigiDocService:(BOOL)useTestDDS andTSUrl:(NSString *)tsUrl withMoppConfiguration:(MoppLibConfiguration *)moppConfiguration andProxyConfiguration:(MoppLibProxyConfiguration*)proxyConfiguration { - [[MoppLibDigidocManager sharedInstance] setupWithSuccess:success andFailure:failure usingTestDigiDocService:useTestDDS andTSUrl:tsUrl withMoppConfiguration: moppConfiguration andProxyConfiguration: proxyConfiguration]; -} - -+ (NSData *)prepareSignature:(NSData *)cert containerPath:(NSString *)containerPath roleData:(MoppLibRoleAddressData *)roleData { - return [MoppLibDigidocManager prepareSignature:cert containerPath:containerPath roleData:roleData]; -} - -+ (void)isSignatureValid:(NSData *)cert signatureValue:(NSData *)signatureValue success:(VoidBlock)success failure:(FailureBlock)failure { - return [MoppLibDigidocManager isSignatureValid:cert signatureValue:signatureValue success:success failure:failure]; -} - -- (NSString *)libdigidocppVersion { - return [[MoppLibDigidocManager sharedInstance] digidocVersion]; -} - -- (BOOL)isConnected { - Reachability *reachability = [Reachability reachabilityForInternetConnection]; - return [reachability currentReachabilityStatus] != NotReachable; -} - -- (NSString *)appVersion { - return [[MoppLibDigidocManager sharedInstance] moppAppVersion]; -} - -- (NSString *)iOSVersion { - return [[MoppLibDigidocManager sharedInstance] iOSVersion]; -} - -- (NSString *)userAgent:(BOOL)shouldIncludeDevices { - return [[MoppLibDigidocManager sharedInstance] userAgent:shouldIncludeDevices]; -} - -- (NSString *)userAgent { - return [[MoppLibDigidocManager sharedInstance] userAgent:false]; -} - -@end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibManager.swift b/MoppLib/MoppLib/PublicInterface/MoppLibManager.swift new file mode 100644 index 000000000..8456143f4 --- /dev/null +++ b/MoppLib/MoppLib/PublicInterface/MoppLibManager.swift @@ -0,0 +1,72 @@ +// +// MoppLibManager.swift +// MoppLib +// +/* + * Copyright 2017 - 2024 Riigi Infosüsteemi Amet + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +import ExternalAccessory +import Network +import UIKit + +public class MoppLibManager: NSObject { + @objc static public let shared = MoppLibManager() + @objc public var isConnected: Bool = false + @objc public var validateOnline = true + + private let monitor = NWPathMonitor() + private let queue = DispatchQueue.global(qos: .background) + + private override init() { + super.init() + monitor.pathUpdateHandler = { path in + self.isConnected = path.status == .satisfied + } + monitor.start(queue: queue) + } + + static func moppAppVersion() -> String { + let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "Unknown" + let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as? String ?? "Unknown" + return "\(version).\(build)" + } + + static func appLanguage() -> String { + return UserDefaults.standard.string(forKey: "kMoppLanguage") ?? "N/A" + } + + @objc static public func userAgent() -> String { + return userAgent(false) + } + + @objc static public func userAgent(_ shouldIncludeDevices: Bool) -> String { + var appInfo = "riadigidoc/\(moppAppVersion()) (iOS \(UIDevice.current.systemVersion)) Lang: \(appLanguage())" + + if shouldIncludeDevices { + let connectedDevices = EAAccessoryManager.shared().connectedAccessories.map { device in + "\(device.manufacturer) \(device.name) (\(device.modelNumber))" + } + if !connectedDevices.isEmpty { + appInfo += " Devices: \(connectedDevices.joined(separator: ", "))" + } + } + + return appInfo + } +} diff --git a/MoppLib/MoppLib/Reachability/Reachability.h b/MoppLib/MoppLib/Reachability/Reachability.h deleted file mode 100644 index b64c4ad90..000000000 --- a/MoppLib/MoppLib/Reachability/Reachability.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - Copyright (C) 2016 Apple Inc. All Rights Reserved. - See https://developer.apple.com/library/content/samplecode/Reachability/Listings/LICENSE_txt.html#//apple_ref/doc/uid/DTS40007324-LICENSE_txt-DontLinkElementID_3 for this sample’s licensing information - - Abstract: - Basic demonstration of how to use the SystemConfiguration Reachablity APIs. - */ - -#import -#import -#import - - -typedef enum : NSInteger { - NotReachable = 0, - ReachableViaWiFi, - ReachableViaWWAN -} NetworkStatus; - -#pragma mark IPv6 Support -//Reachability fully support IPv6. For full details, see ReadMe.md. - - -extern NSString *kReachabilityChangedNotification; - - -@interface Reachability : NSObject - -/*! - * Use to check the reachability of a given host name. - */ -+ (instancetype)reachabilityWithHostName:(NSString *)hostName; - -/*! - * Use to check the reachability of a given IP address. - */ -+ (instancetype)reachabilityWithAddress:(const struct sockaddr *)hostAddress; - -/*! - * Checks whether the default route is available. Should be used by applications that do not connect to a particular host. - */ -+ (instancetype)reachabilityForInternetConnection; - - -#pragma mark reachabilityForLocalWiFi -//reachabilityForLocalWiFi has been removed from the sample. See ReadMe.md for more information. -//+ (instancetype)reachabilityForLocalWiFi; - -/*! - * Start listening for reachability notifications on the current run loop. - */ -- (BOOL)startNotifier; -- (void)stopNotifier; - -- (NetworkStatus)currentReachabilityStatus; - -/*! - * WWAN may be available, but not active until a connection has been established. WiFi may require a connection for VPN on Demand. - */ -- (BOOL)connectionRequired; - -@end diff --git a/MoppLib/MoppLib/Reachability/Reachability.m b/MoppLib/MoppLib/Reachability/Reachability.m deleted file mode 100644 index 7074ff9c1..000000000 --- a/MoppLib/MoppLib/Reachability/Reachability.m +++ /dev/null @@ -1,242 +0,0 @@ -/* - Copyright (C) 2016 Apple Inc. All Rights Reserved. - See https://developer.apple.com/library/content/samplecode/Reachability/Listings/LICENSE_txt.html#//apple_ref/doc/uid/DTS40007324-LICENSE_txt-DontLinkElementID_3 for this sample’s licensing information - - Abstract: - Basic demonstration of how to use the SystemConfiguration Reachablity APIs. - */ - -#import -#import -#import -#import -#import - -#import - -#import "Reachability.h" - -#pragma mark IPv6 Support -//Reachability fully support IPv6. For full details, see ReadMe.md. - - -NSString *kReachabilityChangedNotification = @"kNetworkReachabilityChangedNotification"; - - -#pragma mark - Supporting functions - -#define kShouldPrintReachabilityFlags 1 - -static void PrintReachabilityFlags(SCNetworkReachabilityFlags flags, const char* comment) -{ -#if kShouldPrintReachabilityFlags - - printLog(@"Reachability Flag Status: %c%c %c%c%c%c%c%c%c %s\n", - (flags & kSCNetworkReachabilityFlagsIsWWAN) ? 'W' : '-', - (flags & kSCNetworkReachabilityFlagsReachable) ? 'R' : '-', - - (flags & kSCNetworkReachabilityFlagsTransientConnection) ? 't' : '-', - (flags & kSCNetworkReachabilityFlagsConnectionRequired) ? 'c' : '-', - (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) ? 'C' : '-', - (flags & kSCNetworkReachabilityFlagsInterventionRequired) ? 'i' : '-', - (flags & kSCNetworkReachabilityFlagsConnectionOnDemand) ? 'D' : '-', - (flags & kSCNetworkReachabilityFlagsIsLocalAddress) ? 'l' : '-', - (flags & kSCNetworkReachabilityFlagsIsDirect) ? 'd' : '-', - comment - ); -#endif -} - - -static void ReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info) -{ -#pragma unused (target, flags) - NSCAssert(info != NULL, @"info was NULL in ReachabilityCallback"); - NSCAssert([(__bridge NSObject*) info isKindOfClass: [Reachability class]], @"info was wrong class in ReachabilityCallback"); - - Reachability* noteObject = (__bridge Reachability *)info; - // Post a notification to notify the client that the network reachability changed. - [[NSNotificationCenter defaultCenter] postNotificationName: kReachabilityChangedNotification object: noteObject]; -} - - -#pragma mark - Reachability implementation - -@implementation Reachability -{ - SCNetworkReachabilityRef _reachabilityRef; -} - -+ (instancetype)reachabilityWithHostName:(NSString *)hostName -{ - Reachability* returnValue = NULL; - SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, [hostName UTF8String]); - if (reachability != NULL) - { - returnValue= [[self alloc] init]; - if (returnValue != NULL) - { - returnValue->_reachabilityRef = reachability; - } - else { - CFRelease(reachability); - } - } - return returnValue; -} - - -+ (instancetype)reachabilityWithAddress:(const struct sockaddr *)hostAddress -{ - SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, hostAddress); - - Reachability* returnValue = NULL; - - if (reachability != NULL) - { - returnValue = [[self alloc] init]; - if (returnValue != NULL) - { - returnValue->_reachabilityRef = reachability; - } - else { - CFRelease(reachability); - } - } - return returnValue; -} - - -+ (instancetype)reachabilityForInternetConnection -{ - struct sockaddr_in zeroAddress; - bzero(&zeroAddress, sizeof(zeroAddress)); - zeroAddress.sin_len = sizeof(zeroAddress); - zeroAddress.sin_family = AF_INET; - - return [self reachabilityWithAddress: (const struct sockaddr *) &zeroAddress]; -} - -#pragma mark reachabilityForLocalWiFi -//reachabilityForLocalWiFi has been removed from the sample. See ReadMe.md for more information. -//+ (instancetype)reachabilityForLocalWiFi - - - -#pragma mark - Start and stop notifier - -- (BOOL)startNotifier -{ - BOOL returnValue = NO; - SCNetworkReachabilityContext context = {0, (__bridge void *)(self), NULL, NULL, NULL}; - - if (SCNetworkReachabilitySetCallback(_reachabilityRef, ReachabilityCallback, &context)) - { - if (SCNetworkReachabilityScheduleWithRunLoop(_reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode)) - { - returnValue = YES; - } - } - - return returnValue; -} - - -- (void)stopNotifier -{ - if (_reachabilityRef != NULL) - { - SCNetworkReachabilityUnscheduleFromRunLoop(_reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); - } -} - - -- (void)dealloc -{ - [self stopNotifier]; - if (_reachabilityRef != NULL) - { - CFRelease(_reachabilityRef); - } -} - - -#pragma mark - Network Flag Handling - -- (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags -{ - PrintReachabilityFlags(flags, "networkStatusForFlags"); - if ((flags & kSCNetworkReachabilityFlagsReachable) == 0) - { - // The target host is not reachable. - return NotReachable; - } - - NetworkStatus returnValue = NotReachable; - - if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0) - { - /* - If the target host is reachable and no connection is required then we'll assume (for now) that you're on Wi-Fi... - */ - returnValue = ReachableViaWiFi; - } - - if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) || - (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)) - { - /* - ... and the connection is on-demand (or on-traffic) if the calling application is using the CFSocketStream or higher APIs... - */ - - if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0) - { - /* - ... and no [user] intervention is needed... - */ - returnValue = ReachableViaWiFi; - } - } - - if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) - { - /* - ... but WWAN connections are OK if the calling application is using the CFNetwork APIs. - */ - returnValue = ReachableViaWWAN; - } - - return returnValue; -} - - -- (BOOL)connectionRequired -{ - NSAssert(_reachabilityRef != NULL, @"connectionRequired called with NULL reachabilityRef"); - SCNetworkReachabilityFlags flags; - - if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags)) - { - return (flags & kSCNetworkReachabilityFlagsConnectionRequired); - } - - return NO; -} - - -- (NetworkStatus)currentReachabilityStatus -{ - NSAssert(_reachabilityRef != NULL, @"currentNetworkStatus called with NULL SCNetworkReachabilityRef"); - NetworkStatus returnValue = NotReachable; - SCNetworkReachabilityFlags flags; - - if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags)) - { - returnValue = [self networkStatusForFlags:flags]; - } - - return returnValue; -} - - -@end From 57cbd6b0b3227bf53f4c7defe89bb598b9012939 Mon Sep 17 00:00:00 2001 From: Raul Metsma Date: Tue, 18 Feb 2025 20:40:40 +0200 Subject: [PATCH 3/4] CDoc support Signed-off-by: Raul Metsma --- .github/workflows/build.yml | 4 +- .github/workflows/codeql.yml | 3 + CryptoLib/CryptoLib.xcodeproj/project.pbxproj | 82 ++++----- CryptoLib/CryptoLib/AbstractSmartToken.swift | 1 + CryptoLib/CryptoLib/Addressee.h | 32 ---- CryptoLib/CryptoLib/Addressee.m | 28 --- CryptoLib/CryptoLib/Addressee.swift | 69 ++++++++ CryptoLib/CryptoLib/CDoc2Settings.swift | 102 +++++++++++ CryptoLib/CryptoLib/CdocInfo.h | 31 ---- CryptoLib/CryptoLib/CdocInfo.m | 27 --- .../{CdocParser.h => CdocInfo.swift} | 20 ++- CryptoLib/CryptoLib/CdocParser.m | 39 ---- CryptoLib/CryptoLib/CryptoDataFile.h | 29 --- CryptoLib/CryptoLib/CryptoDataFile.m | 28 --- ...cParserDelegate.h => CryptoDataFile.swift} | 18 +- CryptoLib/CryptoLib/CryptoLib.h | 3 - CryptoLib/CryptoLib/Decrypt.h | 4 +- CryptoLib/CryptoLib/Decrypt.mm | 167 ++++++++++++++---- CryptoLib/CryptoLib/Encrypt.h | 10 +- CryptoLib/CryptoLib/Encrypt.mm | 88 ++++++--- CryptoLib/CryptoLib/Extensions.h | 59 +++++++ CryptoLib/CryptoLib/Ldap/OpenLdap.swift | 14 +- CryptoLib/CryptoLib/SmartCardTokenWrapper.h | 14 +- CryptoLib/CryptoLib/SmartCardTokenWrapper.mm | 45 ++--- CryptoLib/CryptoLib/X509CertificateType.swift | 20 +-- .../CryptoLib/XmlParser/CdocParserDelegate.h | 35 ---- .../CryptoLib/XmlParser/CdocParserDelegate.m | 89 ---------- .../XmlParser/CdocParserDelegate.swift | 77 ++++++++ .../CryptoLib/XmlParser/DdocParserDelegate.m | 79 --------- CryptoLib/build-cdoc.sh | 6 +- MoppApp/MoppApp.xcodeproj/project.pbxproj | 4 - MoppApp/MoppApp/AddresseeActions.swift | 14 +- MoppApp/MoppApp/AddresseeViewController.swift | 16 +- MoppApp/MoppApp/Configuration.swift | 9 +- MoppApp/MoppApp/ContainerActions.swift | 67 +++---- .../MoppApp/ContainerAddAllButtonCell.swift | 1 - MoppApp/MoppApp/ContainerAddresseeCell.swift | 2 - .../MoppApp/ContainerFoundAddresseeCell.swift | 1 - MoppApp/MoppApp/ContainerRemovalActions.swift | 2 +- MoppApp/MoppApp/ContainerViewController.swift | 84 ++++----- MoppApp/MoppApp/CryptoActions.swift | 66 +++---- MoppApp/MoppApp/CryptoContainer.swift | 20 +-- .../CryptoContainerViewController.swift | 47 ++--- MoppApp/MoppApp/DefaultsHelper.swift | 1 + .../MoppApp/Extensions/String+Additions.swift | 14 +- MoppApp/MoppApp/FileManager.swift | 2 +- MoppApp/MoppApp/IDCardSignature.swift | 2 +- MoppApp/MoppApp/IdCardViewController.swift | 66 +++---- MoppApp/MoppApp/Info.plist | 74 ++++++++ .../InitializationViewController.swift | 2 +- MoppApp/MoppApp/ManualProxy.swift | 4 +- MoppApp/MoppApp/MoppApp-Bridging-Header.h | 2 +- MoppApp/MoppApp/MoppApp.swift | 2 +- .../MyeIDChangeCodesViewController.swift | 2 +- MoppApp/MoppApp/MyeIDInfoManager.swift | 2 +- MoppApp/MoppApp/PreviewActions.swift | 6 +- .../RecentContainersViewController.swift | 40 ++--- MoppApp/MoppApp/SettingsConfiguration.swift | 2 +- MoppApp/MoppApp/SignatureUtil.swift | 17 +- .../SigningCategoryViewController.swift | 4 +- MoppApp/MoppApp/SigningActions.swift | 12 +- .../SigningContainerViewController.swift | 22 +-- MoppLib/MoppLib.xcodeproj/project.pbxproj | 96 ++++------ MoppLib/MoppLib/MLFileManager.h | 16 +- MoppLib/MoppLib/MLFileManager.m | 2 +- MoppLib/MoppLib/MoppLibDigidocManager.h | 2 +- MoppLib/MoppLib/MoppLibDigidocManager.mm | 136 ++++++-------- MoppLib/MoppLib/PublicInterface/MoppLib.h | 6 - .../PublicInterface/MoppLibConfiguration.h | 39 ---- ...iguration.m => MoppLibConfiguration.swift} | 40 +++-- .../PublicInterface/MoppLibConstants.h | 15 +- .../PublicInterface/MoppLibContainer.h | 45 ----- .../PublicInterface/MoppLibContainer.m | 83 --------- .../PublicInterface/MoppLibContainer.swift | 82 +++++++++ .../PublicInterface/MoppLibContainerActions.h | 15 +- .../MoppLibContainerActions.mm | 4 +- .../PublicInterface/MoppLibCryptoActions.h | 60 ------- .../PublicInterface/MoppLibCryptoActions.m | 86 --------- .../MoppLibCryptoActions.swift | 48 +++++ ...ppLibSignature.m => MoppLibDataFile.swift} | 19 +- ...e.m => MoppLibDigidocValidateOnline.swift} | 13 +- .../MoppLib/PublicInterface/MoppLibManager.h | 47 +++++ .../MoppLib/PublicInterface/MoppLibManager.m | 94 ++++++++++ .../MoppLibProxyConfiguration.h | 36 ---- .../MoppLibProxyConfiguration.m | 41 ----- ...File.h => MoppLibProxyConfiguration.swift} | 21 ++- .../PublicInterface/MoppLibRoleAddressData.h | 36 ---- ...essData.m => MoppLibRoleAddressData.swift} | 32 ++-- .../PublicInterface/MoppLibSignature.h | 55 ------ .../PublicInterface/MoppLibSignature.swift | 61 +++++++ MoppLib/MoppLib/SmartToken.swift | 31 ++-- .../Requests/Mobile-ID/RequestSignature.swift | 2 +- 92 files changed, 1446 insertions(+), 1649 deletions(-) delete mode 100644 CryptoLib/CryptoLib/Addressee.h delete mode 100644 CryptoLib/CryptoLib/Addressee.m create mode 100644 CryptoLib/CryptoLib/Addressee.swift create mode 100644 CryptoLib/CryptoLib/CDoc2Settings.swift delete mode 100644 CryptoLib/CryptoLib/CdocInfo.h delete mode 100644 CryptoLib/CryptoLib/CdocInfo.m rename CryptoLib/CryptoLib/{CdocParser.h => CdocInfo.swift} (64%) delete mode 100644 CryptoLib/CryptoLib/CdocParser.m delete mode 100644 CryptoLib/CryptoLib/CryptoDataFile.h delete mode 100644 CryptoLib/CryptoLib/CryptoDataFile.m rename CryptoLib/CryptoLib/{XmlParser/DdocParserDelegate.h => CryptoDataFile.swift} (73%) create mode 100644 CryptoLib/CryptoLib/Extensions.h delete mode 100644 CryptoLib/CryptoLib/XmlParser/CdocParserDelegate.h delete mode 100644 CryptoLib/CryptoLib/XmlParser/CdocParserDelegate.m create mode 100644 CryptoLib/CryptoLib/XmlParser/CdocParserDelegate.swift delete mode 100644 CryptoLib/CryptoLib/XmlParser/DdocParserDelegate.m delete mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibConfiguration.h rename MoppLib/MoppLib/PublicInterface/{MoppLibConfiguration.m => MoppLibConfiguration.swift} (50%) delete mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibContainer.h delete mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibContainer.m create mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibContainer.swift delete mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibCryptoActions.h delete mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibCryptoActions.m create mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibCryptoActions.swift rename MoppLib/MoppLib/PublicInterface/{MoppLibSignature.m => MoppLibDataFile.swift} (64%) rename MoppLib/MoppLib/PublicInterface/{MoppLibDataFile.m => MoppLibDigidocValidateOnline.swift} (78%) create mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibManager.h create mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibManager.m delete mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibProxyConfiguration.h delete mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibProxyConfiguration.m rename MoppLib/MoppLib/PublicInterface/{MoppLibDataFile.h => MoppLibProxyConfiguration.swift} (68%) delete mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibRoleAddressData.h rename MoppLib/MoppLib/PublicInterface/{MoppLibRoleAddressData.m => MoppLibRoleAddressData.swift} (62%) delete mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibSignature.h create mode 100644 MoppLib/MoppLib/PublicInterface/MoppLibSignature.swift diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5eede1e44..06887e5c8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -99,8 +99,8 @@ jobs: - name: Set up Homebrew id: set-up-homebrew uses: Homebrew/actions/setup-homebrew@master - - name: Install Swift-sh - run: brew install swift-sh + - name: Install Swift-sh and FlatBuffers + run: brew install swift-sh flatbuffers - name: Build and Archive env: APP_PROVISIONING_PROFILE_UUID: ${{ secrets.APP_PROVISIONING_PROFILE_UUID }} diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index a9411675e..d0c717f92 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -26,6 +26,9 @@ jobs: with: submodules: recursive + - name: Install FlatBuffers + run: brew install flatbuffers + # Creating sample files needed to build, but not needed for CodeQL. # .plist files need a sample structure to avoid error: "unable to read input file as a property list" - name: Create sample files diff --git a/CryptoLib/CryptoLib.xcodeproj/project.pbxproj b/CryptoLib/CryptoLib.xcodeproj/project.pbxproj index 53f584122..dd62d9e99 100644 --- a/CryptoLib/CryptoLib.xcodeproj/project.pbxproj +++ b/CryptoLib/CryptoLib.xcodeproj/project.pbxproj @@ -9,28 +9,24 @@ /* Begin PBXBuildFile section */ 39231FAF20AB1C6C00E1E2B4 /* CryptoLib.h in Headers */ = {isa = PBXBuildFile; fileRef = 39231FAD20AB1C6C00E1E2B4 /* CryptoLib.h */; settings = {ATTRIBUTES = (Public, ); }; }; 39266A5120CFBDF8002E3F23 /* SmartCardTokenWrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 39266A5020CFBDF8002E3F23 /* SmartCardTokenWrapper.mm */; }; - 39266A5D20CFDC59002E3F23 /* CdocParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 39266A5C20CFDC59002E3F23 /* CdocParser.m */; }; - 39266A5F20CFDCB9002E3F23 /* CdocInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 39266A5E20CFDCB9002E3F23 /* CdocInfo.m */; }; - 39266A6320CFE3D4002E3F23 /* CdocParserDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 39266A6220CFE3D4002E3F23 /* CdocParserDelegate.m */; }; - 39266A6420CFE63D002E3F23 /* CdocParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 39266A5B20CFDC41002E3F23 /* CdocParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 39266A6520CFE643002E3F23 /* CdocInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 39266A6020CFDCDF002E3F23 /* CdocInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; 393B66E020DB94B4001DC89B /* cdoc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 393B66DF20DB94B4001DC89B /* cdoc.framework */; }; - 3960E50520C02E5900D4D2FC /* CryptoDataFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 3960E50420C02E5900D4D2FC /* CryptoDataFile.m */; }; - 3960E50620C044EE00D4D2FC /* CryptoDataFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 3960E50320C02DA400D4D2FC /* CryptoDataFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; 39852A4B20AB2418004CB100 /* Decrypt.h in Headers */ = {isa = PBXBuildFile; fileRef = 39852A4120AB2418004CB100 /* Decrypt.h */; settings = {ATTRIBUTES = (Public, ); }; }; 39852A4C20AB2418004CB100 /* Encrypt.h in Headers */ = {isa = PBXBuildFile; fileRef = 39852A4220AB2418004CB100 /* Encrypt.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 39852A5020AB2418004CB100 /* DdocParserDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 39852A4620AB2418004CB100 /* DdocParserDelegate.m */; }; 39852A5120AB2418004CB100 /* SmartCardTokenWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 39852A4720AB2418004CB100 /* SmartCardTokenWrapper.h */; }; 39852A5220AB2418004CB100 /* Decrypt.mm in Sources */ = {isa = PBXBuildFile; fileRef = 39852A4820AB2418004CB100 /* Decrypt.mm */; }; 39852A5320AB2418004CB100 /* Encrypt.mm in Sources */ = {isa = PBXBuildFile; fileRef = 39852A4920AB2418004CB100 /* Encrypt.mm */; }; - 39852A5420AB2418004CB100 /* DdocParserDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 39852A4A20AB2418004CB100 /* DdocParserDelegate.h */; }; - 39E2B4D920AD7A3400CA74A8 /* Addressee.m in Sources */ = {isa = PBXBuildFile; fileRef = 39E2B4CF20AD7A3400CA74A8 /* Addressee.m */; }; - 39E2B4DF20AD7A3400CA74A8 /* Addressee.h in Headers */ = {isa = PBXBuildFile; fileRef = 39E2B4D520AD7A3400CA74A8 /* Addressee.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4E0454632D3BE73D0013DF23 /* CryptoDataFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E0454622D3BE73D0013DF23 /* CryptoDataFile.swift */; }; + 4E0454652D3BE76C0013DF23 /* CdocParserDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E0454642D3BE76C0013DF23 /* CdocParserDelegate.swift */; }; + 4E17B8322D6486040063C5BF /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E17B8302D6485750063C5BF /* libz.tbd */; }; 4E17B8352D64A1080063C5BF /* X509CertificateType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E17B8342D64A0FD0063C5BF /* X509CertificateType.swift */; }; + 4E276E042D81A61000D78F40 /* Extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E276E032D81A60600D78F40 /* Extensions.h */; }; 4E3681D92D40EAAD00D76DAB /* OpenLdap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E3681D72D40EAAD00D76DAB /* OpenLdap.swift */; }; 4E3681DB2D40EAE800D76DAB /* MoppLdapConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E3681DA2D40EAE800D76DAB /* MoppLdapConfiguration.swift */; }; + 4E70AB162D7F0FB700ED97A3 /* CDoc2Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E70AB152D7F0FB100ED97A3 /* CDoc2Settings.swift */; }; 4E8990862D710DC50010CA1F /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E8990852D710DBC0010CA1F /* libxml2.tbd */; }; 4EAC69122D481D1C00A53079 /* ASN1Decoder in Frameworks */ = {isa = PBXBuildFile; productRef = 4EAC69112D481D1C00A53079 /* ASN1Decoder */; }; + 4EB03C7D2D3BE4FB00D5F9AC /* Addressee.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB03C7C2D3BE4FB00D5F9AC /* Addressee.swift */; }; + 4EB03C7F2D3BE6F700D5F9AC /* CdocInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB03C7E2D3BE6F700D5F9AC /* CdocInfo.swift */; }; 4EEE43222D7CF3C9003D0112 /* AbstractSmartToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39266A5920CFD93E002E3F23 /* AbstractSmartToken.swift */; }; DFA40D2F2ADF635F003EF945 /* 3513523f.0 in Resources */ = {isa = PBXBuildFile; fileRef = DFA40D2E2ADF635F003EF945 /* 3513523f.0 */; }; DFC7CA452AE010C9009D85FF /* 9f4c149e.0 in Resources */ = {isa = PBXBuildFile; fileRef = DFC7CA442AE010C9009D85FF /* 9f4c149e.0 */; }; @@ -58,30 +54,25 @@ 39231FAD20AB1C6C00E1E2B4 /* CryptoLib.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CryptoLib.h; sourceTree = ""; }; 39266A5020CFBDF8002E3F23 /* SmartCardTokenWrapper.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = SmartCardTokenWrapper.mm; sourceTree = ""; }; 39266A5920CFD93E002E3F23 /* AbstractSmartToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AbstractSmartToken.swift; sourceTree = ""; }; - 39266A5B20CFDC41002E3F23 /* CdocParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CdocParser.h; sourceTree = ""; }; - 39266A5C20CFDC59002E3F23 /* CdocParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CdocParser.m; sourceTree = ""; }; - 39266A5E20CFDCB9002E3F23 /* CdocInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CdocInfo.m; sourceTree = ""; }; - 39266A6020CFDCDF002E3F23 /* CdocInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CdocInfo.h; sourceTree = ""; }; - 39266A6120CFE36A002E3F23 /* CdocParserDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CdocParserDelegate.h; sourceTree = ""; }; - 39266A6220CFE3D4002E3F23 /* CdocParserDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CdocParserDelegate.m; sourceTree = ""; }; 393B66DF20DB94B4001DC89B /* cdoc.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = cdoc.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3960E50320C02DA400D4D2FC /* CryptoDataFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CryptoDataFile.h; sourceTree = ""; }; - 3960E50420C02E5900D4D2FC /* CryptoDataFile.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CryptoDataFile.m; sourceTree = ""; }; 39852A4120AB2418004CB100 /* Decrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Decrypt.h; sourceTree = ""; }; 39852A4220AB2418004CB100 /* Encrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Encrypt.h; sourceTree = ""; }; - 39852A4620AB2418004CB100 /* DdocParserDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DdocParserDelegate.m; sourceTree = ""; }; 39852A4720AB2418004CB100 /* SmartCardTokenWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SmartCardTokenWrapper.h; sourceTree = ""; }; 39852A4820AB2418004CB100 /* Decrypt.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Decrypt.mm; sourceTree = ""; }; 39852A4920AB2418004CB100 /* Encrypt.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Encrypt.mm; sourceTree = ""; }; - 39852A4A20AB2418004CB100 /* DdocParserDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DdocParserDelegate.h; sourceTree = ""; }; - 39E2B4CF20AD7A3400CA74A8 /* Addressee.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Addressee.m; sourceTree = ""; }; - 39E2B4D520AD7A3400CA74A8 /* Addressee.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Addressee.h; sourceTree = ""; }; 4E01B4A62AEFDD3B00941723 /* build-cdoc.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "build-cdoc.sh"; sourceTree = ""; }; + 4E0454622D3BE73D0013DF23 /* CryptoDataFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CryptoDataFile.swift; sourceTree = ""; }; + 4E0454642D3BE76C0013DF23 /* CdocParserDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CdocParserDelegate.swift; sourceTree = ""; }; + 4E17B8302D6485750063C5BF /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; 4E17B8342D64A0FD0063C5BF /* X509CertificateType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = X509CertificateType.swift; sourceTree = ""; }; + 4E276E032D81A60600D78F40 /* Extensions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Extensions.h; sourceTree = ""; }; 4E3681D72D40EAAD00D76DAB /* OpenLdap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenLdap.swift; sourceTree = ""; }; 4E3681DA2D40EAE800D76DAB /* MoppLdapConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoppLdapConfiguration.swift; sourceTree = ""; }; 4E3AFF7D2D67D45800666AC7 /* openldap.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = openldap.modulemap; sourceTree = ""; }; + 4E70AB152D7F0FB100ED97A3 /* CDoc2Settings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CDoc2Settings.swift; sourceTree = ""; }; 4E8990852D710DBC0010CA1F /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = usr/lib/libxml2.tbd; sourceTree = SDKROOT; }; + 4EB03C7C2D3BE4FB00D5F9AC /* Addressee.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Addressee.swift; sourceTree = ""; }; + 4EB03C7E2D3BE6F700D5F9AC /* CdocInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CdocInfo.swift; sourceTree = ""; }; 4ED24ECB2D4F799800855FC3 /* build-openldap.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "build-openldap.sh"; sourceTree = ""; }; DFA40D2E2ADF635F003EF945 /* 3513523f.0 */ = {isa = PBXFileReference; lastKnownFileType = text; path = 3513523f.0; sourceTree = ""; }; DFC7CA442AE010C9009D85FF /* 9f4c149e.0 */ = {isa = PBXFileReference; lastKnownFileType = text; path = 9f4c149e.0; sourceTree = ""; }; @@ -93,6 +84,7 @@ buildActionMask = 2147483647; files = ( 4E8990862D710DC50010CA1F /* libxml2.tbd in Frameworks */, + 4E17B8322D6486040063C5BF /* libz.tbd in Frameworks */, 4EAC69122D481D1C00A53079 /* ASN1Decoder in Frameworks */, 393B66E020DB94B4001DC89B /* cdoc.framework in Frameworks */, ); @@ -126,24 +118,21 @@ 39231FAC20AB1C6C00E1E2B4 /* CryptoLib */ = { isa = PBXGroup; children = ( + 39231FAD20AB1C6C00E1E2B4 /* CryptoLib.h */, 39E2B4CB20AD7A3400CA74A8 /* Ldap */, 39E414E020AC5C9300141574 /* XmlParser */, + 4E276E032D81A60600D78F40 /* Extensions.h */, 39852A4120AB2418004CB100 /* Decrypt.h */, 39852A4820AB2418004CB100 /* Decrypt.mm */, 39852A4220AB2418004CB100 /* Encrypt.h */, 39852A4920AB2418004CB100 /* Encrypt.mm */, 39852A4720AB2418004CB100 /* SmartCardTokenWrapper.h */, 39266A5020CFBDF8002E3F23 /* SmartCardTokenWrapper.mm */, - 39266A5B20CFDC41002E3F23 /* CdocParser.h */, - 39266A5C20CFDC59002E3F23 /* CdocParser.m */, - 39231FAD20AB1C6C00E1E2B4 /* CryptoLib.h */, 39266A5920CFD93E002E3F23 /* AbstractSmartToken.swift */, - 39E2B4D520AD7A3400CA74A8 /* Addressee.h */, - 39E2B4CF20AD7A3400CA74A8 /* Addressee.m */, - 3960E50320C02DA400D4D2FC /* CryptoDataFile.h */, - 3960E50420C02E5900D4D2FC /* CryptoDataFile.m */, - 39266A5E20CFDCB9002E3F23 /* CdocInfo.m */, - 39266A6020CFDCDF002E3F23 /* CdocInfo.h */, + 4E70AB152D7F0FB100ED97A3 /* CDoc2Settings.swift */, + 4E0454622D3BE73D0013DF23 /* CryptoDataFile.swift */, + 4EB03C7C2D3BE4FB00D5F9AC /* Addressee.swift */, + 4EB03C7E2D3BE6F700D5F9AC /* CdocInfo.swift */, 4E17B8342D64A0FD0063C5BF /* X509CertificateType.swift */, ); path = CryptoLib; @@ -162,10 +151,7 @@ 39E414E020AC5C9300141574 /* XmlParser */ = { isa = PBXGroup; children = ( - 39852A4A20AB2418004CB100 /* DdocParserDelegate.h */, - 39852A4620AB2418004CB100 /* DdocParserDelegate.m */, - 39266A6120CFE36A002E3F23 /* CdocParserDelegate.h */, - 39266A6220CFE3D4002E3F23 /* CdocParserDelegate.m */, + 4E0454642D3BE76C0013DF23 /* CdocParserDelegate.swift */, ); path = XmlParser; sourceTree = ""; @@ -174,6 +160,7 @@ isa = PBXGroup; children = ( 4E8990852D710DBC0010CA1F /* libxml2.tbd */, + 4E17B8302D6485750063C5BF /* libz.tbd */, 393B66DF20DB94B4001DC89B /* cdoc.framework */, ); name = Frameworks; @@ -186,15 +173,11 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 39231FAF20AB1C6C00E1E2B4 /* CryptoLib.h in Headers */, 39852A4B20AB2418004CB100 /* Decrypt.h in Headers */, 39852A4C20AB2418004CB100 /* Encrypt.h in Headers */, - 39852A5420AB2418004CB100 /* DdocParserDelegate.h in Headers */, 39852A5120AB2418004CB100 /* SmartCardTokenWrapper.h in Headers */, - 39E2B4DF20AD7A3400CA74A8 /* Addressee.h in Headers */, - 3960E50620C044EE00D4D2FC /* CryptoDataFile.h in Headers */, - 39266A6520CFE643002E3F23 /* CdocInfo.h in Headers */, - 39266A6420CFE63D002E3F23 /* CdocParser.h in Headers */, - 39231FAF20AB1C6C00E1E2B4 /* CryptoLib.h in Headers */, + 4E276E042D81A61000D78F40 /* Extensions.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -311,15 +294,14 @@ buildActionMask = 2147483647; files = ( 4EEE43222D7CF3C9003D0112 /* AbstractSmartToken.swift in Sources */, - 39266A5F20CFDCB9002E3F23 /* CdocInfo.m in Sources */, - 39266A6320CFE3D4002E3F23 /* CdocParserDelegate.m in Sources */, - 39266A5D20CFDC59002E3F23 /* CdocParser.m in Sources */, - 3960E50520C02E5900D4D2FC /* CryptoDataFile.m in Sources */, - 39852A5020AB2418004CB100 /* DdocParserDelegate.m in Sources */, + 4EB03C7D2D3BE4FB00D5F9AC /* Addressee.swift in Sources */, + 4E70AB162D7F0FB700ED97A3 /* CDoc2Settings.swift in Sources */, 4E17B8352D64A1080063C5BF /* X509CertificateType.swift in Sources */, + 4EB03C7F2D3BE6F700D5F9AC /* CdocInfo.swift in Sources */, 39852A5220AB2418004CB100 /* Decrypt.mm in Sources */, - 39E2B4D920AD7A3400CA74A8 /* Addressee.m in Sources */, + 4E0454632D3BE73D0013DF23 /* CryptoDataFile.swift in Sources */, 39852A5320AB2418004CB100 /* Encrypt.mm in Sources */, + 4E0454652D3BE76C0013DF23 /* CdocParserDelegate.swift in Sources */, 39266A5120CFBDF8002E3F23 /* SmartCardTokenWrapper.mm in Sources */, 4E3681D92D40EAAD00D76DAB /* OpenLdap.swift in Sources */, 4E3681DB2D40EAE800D76DAB /* MoppLdapConfiguration.swift in Sources */, @@ -392,6 +374,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -446,6 +430,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; diff --git a/CryptoLib/CryptoLib/AbstractSmartToken.swift b/CryptoLib/CryptoLib/AbstractSmartToken.swift index 3b686f013..a6bb170e9 100644 --- a/CryptoLib/CryptoLib/AbstractSmartToken.swift +++ b/CryptoLib/CryptoLib/AbstractSmartToken.swift @@ -26,4 +26,5 @@ import Foundation func getCertificate() throws -> Data func decrypt(_ data: Data, pin1: String) throws -> Data func derive(_ data: Data, pin1: String) throws -> Data + func authenticate(_ data: Data, pin1: String) throws -> Data } diff --git a/CryptoLib/CryptoLib/Addressee.h b/CryptoLib/CryptoLib/Addressee.h deleted file mode 100644 index a352a22e7..000000000 --- a/CryptoLib/CryptoLib/Addressee.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// Addressee.h -// CryptoLib -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import - -@interface Addressee : NSObject -@property (nonatomic, strong) NSString *givenName; -@property (nonatomic, strong) NSString *surname; -@property (nonatomic, strong) NSString *identifier; -@property (nonatomic, strong) NSData *cert; -@property (nonatomic, strong) NSDate *validTo; - -@end diff --git a/CryptoLib/CryptoLib/Addressee.m b/CryptoLib/CryptoLib/Addressee.m deleted file mode 100644 index 7d56299aa..000000000 --- a/CryptoLib/CryptoLib/Addressee.m +++ /dev/null @@ -1,28 +0,0 @@ -// -// Addressee.m -// CryptoLib -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import -#import "Addressee.h" - -@implementation Addressee - -@end diff --git a/CryptoLib/CryptoLib/Addressee.swift b/CryptoLib/CryptoLib/Addressee.swift new file mode 100644 index 000000000..3e10f96f1 --- /dev/null +++ b/CryptoLib/CryptoLib/Addressee.swift @@ -0,0 +1,69 @@ +// +// Addressee.swift +// CryptoLib +/* + * Copyright 2017 - 2024 Riigi Infosüsteemi Amet + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +import Foundation +import ASN1Decoder + +public class Addressee: NSObject { + @objc public var data: Data + public let identifier: String + public let givenName: String? + public let surname: String? + public let certType: CertType + public var validTo: Date? + + @objc public init(cn: String, certType: CertType, validTo: Date?, data: Data) { + let split = cn.split(separator: ",").map { String($0) } + if split.count > 1 { + surname = split[0] + givenName = split[1] + identifier = split[2] + } else { + surname = nil + givenName = nil + identifier = cn + } + self.certType = certType + self.validTo = validTo + self.data = data + } + + @objc convenience public init(cn: String, pub: Data) { + self.init(cn: cn, certType: .UnknownType, validTo: nil, data: pub) + } + + convenience init(cert: Data) { + let x509 = try? X509Certificate(der: cert) + self.init(cn: x509?.subject(oid: OID.commonName)?.joined(separator: ",") ?? "", certType: x509?.certType() ?? .UnknownType, validTo: x509?.notAfter, data: cert) + } + + public override func isEqual(_ object: Any?) -> Bool { + guard let other = object as? Addressee else { return false } + return + data == other.data && + identifier == other.identifier && + givenName == other.givenName && + surname == other.surname && + certType == other.certType && + validTo == other.validTo + } +} diff --git a/CryptoLib/CryptoLib/CDoc2Settings.swift b/CryptoLib/CryptoLib/CDoc2Settings.swift new file mode 100644 index 000000000..00ffba4e0 --- /dev/null +++ b/CryptoLib/CryptoLib/CDoc2Settings.swift @@ -0,0 +1,102 @@ +// +// CryptoDataFile.swift +// CryptoLib +/* + * Copyright 2017 - 2024 Riigi Infosüsteemi Amet + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +import Foundation + +public class CDoc2Settings: NSObject { + public static let kUseCDoc2Encryption = "kUseCDoc2Encryption" + public static let kUseCDoc2OnlineEncryption = "kUseCDoc2OnlineEncryption" + public static let kUseCDoc2SelectedService = "kUseCDoc2SelectedService" + public static let kUseCDoc2UUID = "kUseCDoc2UUID" + public static let kUseCDoc2PostURL = "kUseCDoc2PostURL" + public static let kUseCDoc2FetchURL = "kUseCDoc2FetchURL" + + private static func set(_ key: String, value: Bool) { + UserDefaults.standard.set(value, forKey: key) + } + + private static func get(_ key: String) -> Bool { + return UserDefaults.standard.bool(forKey: key) + } + + private static func setString(_ key: String, value: String?) { + UserDefaults.standard.set(value, forKey: key) + } + + private static func getString(_ key: String) -> String? { + return UserDefaults.standard.string(forKey: key) + } + + public class var useEncryption: Bool { + get { get(kUseCDoc2Encryption) } + set { set(kUseCDoc2Encryption, value: newValue) } + } + + public class var useOnlineEncryption: Bool { + get { get(kUseCDoc2OnlineEncryption) } + set { set(kUseCDoc2OnlineEncryption, value: newValue) } + } + + public class var cdoc2SelectedService: String? { + get { getString(kUseCDoc2SelectedService) } + set { setString(kUseCDoc2SelectedService, value: newValue) } + } + + public class var cdoc2UUID: String? { + get { getString(kUseCDoc2UUID) } + set { setString(kUseCDoc2UUID, value: newValue) } + } + + public class var cdoc2PostURL: String? { + get { getString(kUseCDoc2PostURL) } + set { setString(kUseCDoc2PostURL, value: newValue) } + } + + public class var cdoc2FetchURL: String? { + get { getString(kUseCDoc2FetchURL) } + set { setString(kUseCDoc2FetchURL, value: newValue) } + } + + @objc public class func isEncryptionEnabled() -> Bool { + return get(kUseCDoc2Encryption) + } + + @objc public class func isOnlineEncryptionEnabled() -> Bool { + return get(kUseCDoc2OnlineEncryption) + } + + @objc public class func getSelectedService() -> String? { + return getString(kUseCDoc2SelectedService) + } + + @objc public class func getUUID() -> String? { + return getString(kUseCDoc2UUID) + } + + @objc public class func getPostURL() -> String? { + return getString(kUseCDoc2PostURL) + } + + @objc public class func getFetchURL() -> String? { + return getString(kUseCDoc2FetchURL) + } +} diff --git a/CryptoLib/CryptoLib/CdocInfo.h b/CryptoLib/CryptoLib/CdocInfo.h deleted file mode 100644 index 9e3dae7be..000000000 --- a/CryptoLib/CryptoLib/CdocInfo.h +++ /dev/null @@ -1,31 +0,0 @@ -// -// CdocInfo.h -// CryptoLib -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import -#import "CryptoDataFile.h" -#import "Addressee.h" - -@interface CdocInfo : NSObject -@property (nonatomic, strong) NSMutableArray *addressees; -@property (nonatomic, strong) NSMutableArray *dataFiles; - -@end diff --git a/CryptoLib/CryptoLib/CdocInfo.m b/CryptoLib/CryptoLib/CdocInfo.m deleted file mode 100644 index 5febffa03..000000000 --- a/CryptoLib/CryptoLib/CdocInfo.m +++ /dev/null @@ -1,27 +0,0 @@ -// -// CdocInfo.m -// CryptoLib -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import -#import "CdocInfo.h" - -@implementation CdocInfo -@end diff --git a/CryptoLib/CryptoLib/CdocParser.h b/CryptoLib/CryptoLib/CdocInfo.swift similarity index 64% rename from CryptoLib/CryptoLib/CdocParser.h rename to CryptoLib/CryptoLib/CdocInfo.swift index b48fdc011..f72e3e378 100644 --- a/CryptoLib/CryptoLib/CdocParser.h +++ b/CryptoLib/CryptoLib/CdocInfo.swift @@ -1,5 +1,5 @@ // -// CdocParser.h +// CdocInfo.swift // CryptoLib /* * Copyright 2017 - 2024 Riigi Infosüsteemi Amet @@ -20,11 +20,19 @@ * */ -#import -#import "CdocInfo.h" +import Foundation -@interface CdocParser : NSObject -- (CdocInfo*)parseCdocInfo:(NSString*)fullpath; -@end +public class CdocInfo: NSObject { + public let addressees: [Addressee] + public let dataFiles: [CryptoDataFile] + @objc public init(addressees: [Addressee] = []) { + self.addressees = addressees + self.dataFiles = [] + } + @objc public init(addressees: [Addressee] = [], dataFiles: [CryptoDataFile] = []) { + self.addressees = addressees + self.dataFiles = dataFiles + } +} diff --git a/CryptoLib/CryptoLib/CdocParser.m b/CryptoLib/CryptoLib/CdocParser.m deleted file mode 100644 index fcb865861..000000000 --- a/CryptoLib/CryptoLib/CdocParser.m +++ /dev/null @@ -1,39 +0,0 @@ -// -// CdocParser.m -// CryptoLib -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ -#import "CdocParser.h" -#import "CdocInfo.h" -#import "CdocParserDelegate.h" - -@implementation CdocParser - -- (CdocInfo*)parseCdocInfo:(NSString*)fullpath { - NSData *data = [[NSData alloc] initWithContentsOfFile:fullpath]; - NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; - CdocParserDelegate *parserDelegate = [CdocParserDelegate new]; - [parser setDelegate:(id)parserDelegate]; - [parser parse]; - CdocInfo *response = [CdocInfo new]; - response.addressees = parserDelegate.addressees; - response.dataFiles = parserDelegate.dataFiles; - return response; -} -@end diff --git a/CryptoLib/CryptoLib/CryptoDataFile.h b/CryptoLib/CryptoLib/CryptoDataFile.h deleted file mode 100644 index ca4b1428f..000000000 --- a/CryptoLib/CryptoLib/CryptoDataFile.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// CryptoDataFile.h -// CryptoLib -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import - -@interface CryptoDataFile : NSObject -@property (nonatomic, strong) NSString *filename; -@property (nonatomic, strong) NSString *filePath; - -@end diff --git a/CryptoLib/CryptoLib/CryptoDataFile.m b/CryptoLib/CryptoLib/CryptoDataFile.m deleted file mode 100644 index f4edfd1d4..000000000 --- a/CryptoLib/CryptoLib/CryptoDataFile.m +++ /dev/null @@ -1,28 +0,0 @@ -// -// DataFile.m -// CryptoLib -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import -#import "CryptoDataFile.h" - -@implementation CryptoDataFile - -@end diff --git a/CryptoLib/CryptoLib/XmlParser/DdocParserDelegate.h b/CryptoLib/CryptoLib/CryptoDataFile.swift similarity index 73% rename from CryptoLib/CryptoLib/XmlParser/DdocParserDelegate.h rename to CryptoLib/CryptoLib/CryptoDataFile.swift index b68d4ca8b..3646ba6fd 100644 --- a/CryptoLib/CryptoLib/XmlParser/DdocParserDelegate.h +++ b/CryptoLib/CryptoLib/CryptoDataFile.swift @@ -1,5 +1,5 @@ // -// DdocParserDelegate.h +// CryptoDataFile.swift // CryptoLib /* * Copyright 2017 - 2024 Riigi Infosüsteemi Amet @@ -20,12 +20,14 @@ * */ -#import +import Foundation -@interface DdocParserDelegate : NSObject -{ +public class CryptoDataFile: NSObject { + @objc public let filename: String + @objc public let filePath: String? + + public init(filename: String, filePath: String? = nil) { + self.filename = filename + self.filePath = filePath + } } -@property (nonatomic, retain) NSMutableDictionary *dictionary; -@property (nonatomic, retain) NSString *lastKey; -@property (nonatomic, retain) NSString *currentElement; -@end diff --git a/CryptoLib/CryptoLib/CryptoLib.h b/CryptoLib/CryptoLib/CryptoLib.h index 0b0c0f54e..514a81497 100644 --- a/CryptoLib/CryptoLib/CryptoLib.h +++ b/CryptoLib/CryptoLib/CryptoLib.h @@ -30,8 +30,5 @@ FOUNDATION_EXPORT const unsigned char CryptoLibVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import -#import -#import #import #import -#import diff --git a/CryptoLib/CryptoLib/Decrypt.h b/CryptoLib/CryptoLib/Decrypt.h index 6a8956c33..66fb469b5 100644 --- a/CryptoLib/CryptoLib/Decrypt.h +++ b/CryptoLib/CryptoLib/Decrypt.h @@ -23,7 +23,9 @@ #import @protocol AbstractSmartToken; +@class CdocInfo; @interface Decrypt : NSObject -- (NSMutableDictionary *)decryptFile:(NSString *)fullPath withPin:(NSString *)pin withToken:(id)smartToken error:(NSError**)error; ++ (void)parseCdocInfoWithFullPath:(NSString *)fullPath success:(void (^)(CdocInfo *))success; ++ (NSDictionary *)decryptFile:(NSString *)fullPath withPin:(NSString *)pin withToken:(id)smartToken error:(NSError**)error; @end diff --git a/CryptoLib/CryptoLib/Decrypt.mm b/CryptoLib/CryptoLib/Decrypt.mm index f2b233f07..fadc6e6c8 100644 --- a/CryptoLib/CryptoLib/Decrypt.mm +++ b/CryptoLib/CryptoLib/Decrypt.mm @@ -21,48 +21,151 @@ */ #import "Decrypt.h" +#import "Extensions.h" #import "SmartCardTokenWrapper.h" -#import "DdocParserDelegate.h" +#import -#import -#import +#include +#include +#include +#include +#include + +@implementation Addressee (label) + +- (instancetype)initWithLabel:(const std::string &)label pub:(NSData*)pub { + std::map info = libcdoc::Recipient::parseLabel(label); + id cn = info.contains("cn") ? [NSString stringWithStdString:info["cn"]] : nil; + id type = info.contains("last_name") ? [NSString stringWithStdString:info["type"]] : nil; + CertType certType = CertTypeUnknownType; + if ([type isEqualToString:@"ID-card"]) { + certType = CertTypeIDCardType; + } else if ([type isEqualToString:@"Digi-ID"]) { + certType = CertTypeDigiIDType; + } else if ([type isEqualToString:@"Digi-ID E-RESIDENT"]) { + certType = CertTypeEResidentType; + } + id validTo = nil; + if (info.contains("server_exp")) { + long long epochTime = [[NSString stringWithStdString:info["server_exp"]] longLongValue]; + validTo = [NSDate dateWithTimeIntervalSince1970:epochTime]; + } + if (self = [self initWithCn:cn certType:certType validTo:validTo data:pub]) { + } + return self; +} + +@end + +struct Settings: public libcdoc::Configuration { + std::string getValue(std::string_view domain, std::string_view param) const final { + if(param == KEYSERVER_FETCH_URL) + return [CDoc2Settings.getFetchURL toString]; + if(param == KEYSERVER_SEND_URL) + return [CDoc2Settings.getPostURL toString]; + return {}; + } +}; + +struct Network: public libcdoc::NetworkBackend +{ + std::vector cert; + SmartCardTokenWrapper *token = nullptr; + + libcdoc::result_t getClientTLSCertificate(std::vector &dst) final { + dst = cert; + return libcdoc::OK; + } + + libcdoc::result_t signTLS(std::vector &dst, libcdoc::CryptoBackend::HashAlgorithm algorithm, const std::vector &digest) final { + return token->sign(dst, algorithm, digest, 0); + } +}; @implementation Decrypt -- (NSMutableDictionary *)decryptFile:(NSString *)fullPath withPin:(NSString *)pin withToken:(id)smartToken error:(NSError**)error { ++ (void)parseCdocInfoWithFullPath:(NSString *)fullPath success:(void (^)(CdocInfo *))success { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + if([fullPath.pathExtension caseInsensitiveCompare:@"cdoc"] == NSOrderedSame) { + CdocInfo *result = [CdocParser parseWithPath:fullPath]; + return dispatch_async(dispatch_get_main_queue(), ^{ success(result); }); + } - std::string encodedFullPath = std::string([fullPath UTF8String]); - std::string encodedPin = std::string([pin UTF8String]); - CDOCReader cdocReader(encodedFullPath); - SmartCardTokenWrapper token(encodedPin, smartToken); + std::unique_ptr reader(libcdoc::CDocReader::createReader(fullPath.UTF8String, nullptr, nullptr, nullptr)); + if(!reader) + return dispatch_async(dispatch_get_main_queue(), ^{ success(nil); }); + NSMutableArray *addressees = [[NSMutableArray alloc] init]; + for(const libcdoc::Lock &lock: reader->getLocks()) + { + if(lock.isCertificate()) { + [addressees addObject:[[Addressee alloc] initWithLabel:lock.label pub:[NSData dataFromVector:lock.getBytes(libcdoc::Lock::CERT)]]]; + } else if(lock.isPKI()) { + [addressees addObject:[[Addressee alloc] initWithLabel:lock.label pub:[NSData dataFromVector:lock.getBytes(libcdoc::Lock::RCPT_KEY)]]]; + } else { + [addressees addObject:[[Addressee alloc] initWithCn:@"Unknown capsule" pub:[NSData data]]]; + } + } - NSMutableDictionary *response = [NSMutableDictionary new]; - std::vector decryptedData = cdocReader.decryptData(&token); - *error = token.lastError(); - if (decryptedData.empty()){ - return response; + CdocInfo *result = [[CdocInfo alloc] initWithAddressees:addressees]; + return dispatch_async(dispatch_get_main_queue(), ^{ success(result); }); + }); +} + ++ (NSDictionary *)decryptFile:(NSString *)fullPath withPin:(NSString *)pin withToken:(id)smartToken error:(NSError**)error { + SmartCardTokenWrapper token(pin.UTF8String, smartToken); + Settings conf; + Network network; + network.token = &token; + network.cert = token.cert(); + if(network.cert.empty()) { + if (error != nil) { + *error = token.lastError(); + } + return nil; } - NSData *decrypted = [NSData dataWithBytes:decryptedData.data() length:decryptedData.size()]; - std::string filename = cdocReader.fileName(); - std::string mimetype = cdocReader.mimeType(); - - NSString *nsFilename = [NSString stringWithCString:filename.c_str() encoding: NSUTF8StringEncoding]; - if ([[nsFilename pathExtension] isEqualToString: @"ddoc"]){ - NSXMLParser *parser = [[NSXMLParser alloc] initWithData:decrypted]; - DdocParserDelegate *parserDelegate = [[DdocParserDelegate alloc] init]; - [parser setDelegate:(id)parserDelegate]; - [parser parse]; - NSMutableDictionary *fileDictionary; - fileDictionary = parserDelegate.dictionary; - for (id key in fileDictionary){ - NSString *value = [fileDictionary objectForKey:key]; - NSData *nsdataFromBase64String = [[NSData alloc] initWithBase64EncodedString: value options:NSDataBase64DecodingIgnoreUnknownCharacters]; - [response setObject:nsdataFromBase64String forKey:key]; - + + std::unique_ptr reader(libcdoc::CDocReader::createReader(fullPath.UTF8String, &conf, &token, &network)); + + auto idx = reader->getLockForCert(network.cert); + if(idx < 0) + return nil; + std::vector fmk; + if(reader->getFMK(fmk, unsigned(idx)) != 0 || fmk.empty()) { + if (error != nil) { + *error = token.lastError(); + } + return nil; + } + if(reader->beginDecryption(fmk) != 0) + return nil; + + NSMutableDictionary *response = [NSMutableDictionary new]; + std::string name; + int64_t size{}; + while((reader->nextFile(name, size)) == 0) + { + NSMutableData *data = [[NSMutableData alloc] initWithLength:16 * 1024]; + NSUInteger currentLength = 0; + + uint64_t bytesRead = 0; + while (true) { + bytesRead = reader->readData(reinterpret_cast(data.mutableBytes) + currentLength, 16 * 1024); + if (bytesRead < 0) { + NSLog(@"Error reading data from file: %s", name.c_str()); + break; + } + + currentLength += bytesRead; + [data setLength:currentLength]; + if (bytesRead == 0) { + break; + } + [data increaseLengthBy:16 * 1024]; } - } else { - [response setObject:decrypted forKey:nsFilename]; + [response setObject:data forKey:[NSString stringWithStdString:name]]; } + if (reader->finishDecryption() != 0) + return nil; return response; } diff --git a/CryptoLib/CryptoLib/Encrypt.h b/CryptoLib/CryptoLib/Encrypt.h index dfb58a6c2..eebc65eff 100644 --- a/CryptoLib/CryptoLib/Encrypt.h +++ b/CryptoLib/CryptoLib/Encrypt.h @@ -22,6 +22,12 @@ #import -@interface Encrypt : NSObject -- (BOOL)encryptFile: (NSString *)fullPath withDataFiles :(NSArray *) dataFiles withAddressees: (NSArray *) addressees; +@class Addressee; +@class CryptoDataFile; + +@interface Encrypt: NSObject + ++ (void)encryptFile:(NSString *)fullPath withDataFiles:(NSArray *)dataFiles + withAddressees:(NSArray *)addressees success:(void (^)(void))success failure:(void (^)(void))failure; + @end diff --git a/CryptoLib/CryptoLib/Encrypt.mm b/CryptoLib/CryptoLib/Encrypt.mm index 66fcc06b9..d955bb42f 100644 --- a/CryptoLib/CryptoLib/Encrypt.mm +++ b/CryptoLib/CryptoLib/Encrypt.mm @@ -20,35 +20,83 @@ * */ - #import "Encrypt.h" -#import "Addressee.h" -#import "CryptoDataFile.h" +#import "Extensions.h" + +#import -#import +#include +#include +#include +#include + +struct Settings: public libcdoc::Configuration { + std::string getValue(std::string_view domain, std::string_view param) const final { + if(param == KEYSERVER_FETCH_URL) + return [CDoc2Settings.getFetchURL toString]; + if(param == KEYSERVER_SEND_URL) + return [CDoc2Settings.getPostURL toString]; + return {}; + } +}; @implementation Encrypt -- (BOOL)encryptFile: (NSString *)fullPath withDataFiles :(NSArray *) dataFiles withAddressees: (NSArray *) addressees { ++ (void)encryptFile:(NSString *)fullPath withDataFiles:(NSArray *)dataFiles withAddressees:(NSArray *)addressees + success:(void (^)(void))success failure:(void (^)(void))failure { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + int version = [fullPath.pathExtension caseInsensitiveCompare:@"cdoc2"] == NSOrderedSame ? 2 : 1; + Settings conf; + libcdoc::NetworkBackend network; + std::unique_ptr writer(libcdoc::CDocWriter::createWriter(version, fullPath.UTF8String, &conf, nullptr, &network)); - std::string encodedFullPath = std::string([fullPath UTF8String]); + if (!writer) { + return dispatch_async(dispatch_get_main_queue(), failure); + } - CDOCWriter cdocWriter(encodedFullPath, "http://www.w3.org/2009/xmlenc11#aes256-gcm"); + if (version == 2 && CDoc2Settings.isOnlineEncryptionEnabled) { + NSString *server_id = CDoc2Settings.getSelectedService; + for (Addressee *addressee in addressees) { + if (writer->addRecipient(libcdoc::Recipient::makeEIDServer([addressee.data toVector], [server_id toString])) != 0) { + return dispatch_async(dispatch_get_main_queue(), failure); + } + } + } else { + for (Addressee *addressee in addressees) { + if (writer->addRecipient(libcdoc::Recipient::makeEID([addressee.data toVector])) != 0) { + return dispatch_async(dispatch_get_main_queue(), failure); + } + } + } - for (CryptoDataFile *dataFile in dataFiles) { - std::string encodedDataFilePath = std::string([dataFile.filePath UTF8String]); - std::string encodedFilename = std::string([dataFile.filename UTF8String]); - cdocWriter.addFile(encodedFilename, "application/octet-stream", encodedDataFilePath); - } - for (Addressee *addressee in addressees) { - NSData *cert = addressee.cert; - unsigned char *buffer = reinterpret_cast(const_cast(cert.bytes)); - std::vector result = std::vector(buffer, buffer + cert.length); - - cdocWriter.addRecipient(std::move(result)); - } + if (writer->beginEncryption() != 0) { + return dispatch_async(dispatch_get_main_queue(), failure); + } + + for (CryptoDataFile *dataFile in dataFiles) { + NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:dataFile.filePath]; + if (!fileHandle) { + NSLog(@"Failed to open file at path: %@", dataFile.filePath); + return dispatch_async(dispatch_get_main_queue(), failure); + } + + if (writer->addFile(dataFile.filename.UTF8String, [fileHandle seekToEndOfFile]) != 0) { + return dispatch_async(dispatch_get_main_queue(), failure); + } + [fileHandle seekToFileOffset:0]; - return cdocWriter.encrypt(); + NSUInteger blockSize = 1024 * 16; + NSData *data; + while ((data = [fileHandle readDataOfLength:blockSize]) && data.length > 0) { + if (writer->writeData(reinterpret_cast(data.bytes), data.length) != 0) { + return dispatch_async(dispatch_get_main_queue(), failure); + } + } + [fileHandle closeFile]; + } + bool result = writer->finishEncryption() == 0; + dispatch_async(dispatch_get_main_queue(), result ? success : failure); + }); } @end diff --git a/CryptoLib/CryptoLib/Extensions.h b/CryptoLib/CryptoLib/Extensions.h new file mode 100644 index 000000000..532ece33e --- /dev/null +++ b/CryptoLib/CryptoLib/Extensions.h @@ -0,0 +1,59 @@ +// +// Decrypt.h +// CryptoLib +/* + * Copyright 2017 - 2024 Riigi Infosüsteemi Amet + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#import + +#include +#include + +@interface NSString (std_string) +- (std::string)toString; +@end + +@interface NSData (std_vector) +- (std::vector)toVector; +@end + +@implementation NSString (std_string) ++ (instancetype)stringWithStdString:(const std::string&)data { + return data.empty() ? nil : [NSString stringWithUTF8String:data.c_str()]; +} + +- (std::string)toString { + return {self.UTF8String}; +} +@end + +@implementation NSData (std_vector) ++ (instancetype)dataFromVector:(const std::vector&)data { + return data.empty() ? nil : [NSData dataWithBytes:(void *)data.data() length:data.size()]; +} + ++ (instancetype)dataFromVectorNoCopy:(const std::vector&)data { + return data.empty() ? nil : [NSData dataWithBytesNoCopy:(void *)data.data() length:data.size() freeWhenDone:0]; +} + +- (std::vector)toVector { + const auto *p = reinterpret_cast(self.bytes); + return {p, std::next(p, self.length)}; +} +@end diff --git a/CryptoLib/CryptoLib/Ldap/OpenLdap.swift b/CryptoLib/CryptoLib/Ldap/OpenLdap.swift index 1be20f239..791c7463c 100644 --- a/CryptoLib/CryptoLib/Ldap/OpenLdap.swift +++ b/CryptoLib/CryptoLib/Ldap/OpenLdap.swift @@ -179,19 +179,7 @@ public class OpenLdap { !x509.extendedKeyUsage.contains(OID.serverAuth.rawValue), type != .ESealType || !x509.extendedKeyUsage.contains(OID.clientAuth.rawValue), type != .MobileIDType && type != .UnknownType { - let cn = x509.subject(oid: OID.commonName)?.joined(separator: ",") ?? "" - let split = cn.split(separator: ",").map { String($0) } - let addressee = Addressee() - if split.count == 3 { - addressee.surname = split[0] - addressee.givenName = split[1] - addressee.identifier = split[2] - } else { - addressee.identifier = cn - } - addressee.cert = data - addressee.validTo = x509.notAfter ?? Date() - result.append(addressee) + result.append(Addressee(cert: data)) } } return result diff --git a/CryptoLib/CryptoLib/SmartCardTokenWrapper.h b/CryptoLib/CryptoLib/SmartCardTokenWrapper.h index 7814c4ad9..db72e4287 100644 --- a/CryptoLib/CryptoLib/SmartCardTokenWrapper.h +++ b/CryptoLib/CryptoLib/SmartCardTokenWrapper.h @@ -22,29 +22,27 @@ #if __cplusplus -#import "cdoc/Token.h" - +#import #import - #include @protocol AbstractSmartToken; -class SmartCardTokenWrapper: public Token +class SmartCardTokenWrapper: public libcdoc::CryptoBackend { public: SmartCardTokenWrapper(const std::string &password, id smartToken); ~SmartCardTokenWrapper() noexcept; - std::vector cert() const final; - std::vector decrypt(const std::vector &data) const final; - std::vector derive(const std::vector &publicKey) const final; + std::vector cert() const; + libcdoc::result_t deriveECDH1(std::vector &dst, const std::vector &public_key, unsigned int idx) final; + libcdoc::result_t decryptRSA(std::vector &dst, const std::vector &data, bool oaep, unsigned int idx) final; + libcdoc::result_t sign(std::vector &dst, HashAlgorithm algorithm, const std::vector &digest, unsigned int idx) final; NSError* lastError() const; private: class Private; std::unique_ptr token; - static std::vector encodeData(const NSData *dataBlock); }; #endif diff --git a/CryptoLib/CryptoLib/SmartCardTokenWrapper.mm b/CryptoLib/CryptoLib/SmartCardTokenWrapper.mm index 37f8a1e72..7bed78a6b 100644 --- a/CryptoLib/CryptoLib/SmartCardTokenWrapper.mm +++ b/CryptoLib/CryptoLib/SmartCardTokenWrapper.mm @@ -21,11 +21,12 @@ * */ -#include "SmartCardTokenWrapper.h" +#import "SmartCardTokenWrapper.h" +#import "Extensions.h" #import -class SmartCardTokenWrapper::Private{ +class SmartCardTokenWrapper::Private { public: id smartTokenClass; NSString *pin1; @@ -35,40 +36,44 @@ SmartCardTokenWrapper::SmartCardTokenWrapper(const std::string &password, id smartToken) : token(new Private) { - token->pin1 = [NSString stringWithUTF8String:password.c_str()]; + token->pin1 = [NSString stringWithStdString:password]; token->smartTokenClass = smartToken; } SmartCardTokenWrapper::~SmartCardTokenWrapper() noexcept = default; -NSError* SmartCardTokenWrapper::lastError() const { +NSError* SmartCardTokenWrapper::lastError() const +{ return token->error; } -std::vector SmartCardTokenWrapper::cert() const { - NSError *error; - auto result = encodeData([token->smartTokenClass getCertificateAndReturnError:&error]); +std::vector SmartCardTokenWrapper::cert() const { + NSError *error = nil; + auto result = [[token->smartTokenClass getCertificateAndReturnError:&error] toVector]; token->error = error; return result; } -std::vector SmartCardTokenWrapper::decrypt(const std::vector &data) const { - NSMutableData *nsdata = [NSMutableData dataWithBytesNoCopy:(void *)data.data() length:data.size() freeWhenDone:0]; - NSError *error; - auto result = encodeData([token->smartTokenClass decrypt:nsdata pin1:token->pin1 error:&error]); +libcdoc::result_t SmartCardTokenWrapper::deriveECDH1(std::vector& dst, const std::vector &public_key, unsigned int idx) +{ + NSError *error = nil; + dst = [[token->smartTokenClass derive:[NSData dataFromVectorNoCopy:public_key] pin1:token->pin1 error:&error] toVector]; token->error = error; - return result; + return dst.empty() ? libcdoc::CRYPTO_ERROR : libcdoc::OK; } -std::vector SmartCardTokenWrapper::derive(const std::vector &publicKey) const { - NSMutableData *nsdata = [NSMutableData dataWithBytesNoCopy:(void *)publicKey.data() length:publicKey.size() freeWhenDone:0]; - NSError *error; - auto result = encodeData([token->smartTokenClass derive:nsdata pin1:token->pin1 error:&error]); +libcdoc::result_t SmartCardTokenWrapper::decryptRSA(std::vector& dst, const std::vector& data, bool oaep, unsigned int idx) +{ + NSError *error = nil; + dst = [[token->smartTokenClass decrypt:[NSData dataFromVectorNoCopy:data] pin1:token->pin1 error:&error] toVector]; token->error = error; - return result; + return dst.empty() ? libcdoc::CRYPTO_ERROR : libcdoc::OK; } -std::vector SmartCardTokenWrapper::encodeData(const NSData *dataBlock) { - const unsigned char *buffer = reinterpret_cast(dataBlock.bytes); - return {buffer, std::next(buffer, dataBlock.length)}; +libcdoc::result_t SmartCardTokenWrapper::sign(std::vector &dst, HashAlgorithm algorithm, const std::vector &digest, unsigned int idx) +{ + NSError *error = nil; + dst = [[token->smartTokenClass authenticate:[NSData dataFromVectorNoCopy:digest] pin1:token->pin1 error:&error] toVector]; + token->error = error; + return dst.empty() ? libcdoc::CRYPTO_ERROR : libcdoc::OK; } diff --git a/CryptoLib/CryptoLib/X509CertificateType.swift b/CryptoLib/CryptoLib/X509CertificateType.swift index 7560551de..791084fe2 100644 --- a/CryptoLib/CryptoLib/X509CertificateType.swift +++ b/CryptoLib/CryptoLib/X509CertificateType.swift @@ -22,17 +22,17 @@ import ASN1Decoder -extension X509Certificate { - public enum CertType { - case UnknownType - case IDCardType - case DigiIDType - case EResidentType - case MobileIDType - case SmartIDType - case ESealType - } +@objc public enum CertType: UInt { + case UnknownType + case IDCardType + case DigiIDType + case EResidentType + case MobileIDType + case SmartIDType + case ESealType +} +extension X509Certificate { public func certType() -> CertType { if let ext = extensionObject(oid: OID.certificatePolicies) as? X509Certificate.CertificatePoliciesExtension { for policy in ext.policies ?? [] { diff --git a/CryptoLib/CryptoLib/XmlParser/CdocParserDelegate.h b/CryptoLib/CryptoLib/XmlParser/CdocParserDelegate.h deleted file mode 100644 index 5d04f947d..000000000 --- a/CryptoLib/CryptoLib/XmlParser/CdocParserDelegate.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// CdocParserDelegate.h -// CryptoLib -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import -#import "Addressee.h" -#import "CryptoDataFile.h" -@interface CdocParserDelegate : NSObject -{ -} -@property (nonatomic, strong) NSMutableArray *addressees; -@property (nonatomic, strong) NSMutableArray *dataFiles; -@property (nonatomic, retain) NSString *currentFilenameNode; -@property (nonatomic) BOOL isNextCharactersFilename; -@property (nonatomic) BOOL isNextCharactersCertificate; -@property (nonatomic, strong) Addressee *lastAddressee; -@end diff --git a/CryptoLib/CryptoLib/XmlParser/CdocParserDelegate.m b/CryptoLib/CryptoLib/XmlParser/CdocParserDelegate.m deleted file mode 100644 index 4331f9c38..000000000 --- a/CryptoLib/CryptoLib/XmlParser/CdocParserDelegate.m +++ /dev/null @@ -1,89 +0,0 @@ -// -// CdocParserDelegate.m -// CryptoLib -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import "CdocParserDelegate.h" -@interface CdocParserDelegate () -@end - -@implementation CdocParserDelegate { -} - -- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { - if ([elementName isEqualToString:@"denc:EncryptedKey"]) { - if (_addressees == nil){ - _addressees = [NSMutableArray new]; - } - if (_lastAddressee == nil){ - _lastAddressee = [Addressee new]; - } - NSString *attribute = attributeDict[@"Recipient"]; - NSArray *cn = [attribute componentsSeparatedByString:@","]; - Addressee *addressee = [Addressee new]; - if (cn.count > 1) { - addressee.surname = cn[0]; - addressee.givenName = cn[1]; - addressee.identifier = cn[2]; - } else { - addressee.identifier = cn[0]; - } - [_addressees addObject:addressee]; - _lastAddressee = addressee; - } - if ([elementName isEqualToString:@"ds:X509Certificate"]) { - _isNextCharactersCertificate = YES; - } - if ([elementName isEqualToString:@"denc:EncryptionProperty"] && [[attributeDict valueForKey: @"Name"] isEqual: @"orig_file"]) { - _isNextCharactersFilename = YES; - } -} - --(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { - if (_isNextCharactersFilename) { - if (_currentFilenameNode) { - _currentFilenameNode = [_currentFilenameNode stringByAppendingString:string]; - } else { - _currentFilenameNode = string; - } - } - - if (_isNextCharactersCertificate) { - _lastAddressee.cert = [[NSData alloc] initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters]; - } -} - -- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName { - if (_isNextCharactersFilename) { - if (_dataFiles == nil){ - _dataFiles = [NSMutableArray new]; - } - NSArray *filenameWithBytesLength = [_currentFilenameNode componentsSeparatedByString:@"|"]; - NSString *filename = filenameWithBytesLength[0]; - CryptoDataFile *dataFile = [CryptoDataFile new]; - dataFile.filename = filename; - [_dataFiles addObject:dataFile]; - } - _currentFilenameNode = nil; - _isNextCharactersFilename = NO; - _isNextCharactersCertificate = NO; -} - -@end diff --git a/CryptoLib/CryptoLib/XmlParser/CdocParserDelegate.swift b/CryptoLib/CryptoLib/XmlParser/CdocParserDelegate.swift new file mode 100644 index 000000000..e4d0e3465 --- /dev/null +++ b/CryptoLib/CryptoLib/XmlParser/CdocParserDelegate.swift @@ -0,0 +1,77 @@ +// +// CdocParserDelegate.swift +// CryptoLib +/* + * Copyright 2017 - 2024 Riigi Infosüsteemi Amet + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +import Foundation + +public class CdocParser: NSObject { + @objc static public func parse(path: String) -> CdocInfo? { + guard let parser = XMLParser(contentsOf: URL(fileURLWithPath: path)) else { + NSLog("Error: Unable to read file at \(path)") + return nil + } + let delegate = CdocParserDelegate() + parser.delegate = delegate; + guard parser.parse() else { + NSLog("Error: Failed to parse XML") + return nil + } + return CdocInfo(addressees: delegate.addressees, dataFiles: delegate.dataFiles) + } +} + +class CdocParserDelegate: NSObject, XMLParserDelegate { + public var addressees: [Addressee] = [] + public var dataFiles: [CryptoDataFile] = [] + var data: String? = nil + + func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String: String]) { + switch elementName { + case "ds:X509Certificate": + data = String() + case "denc:EncryptionProperty" where attributeDict["Name"] == "orig_file": + data = String() + default: break + } + } + + func parser(_ parser: XMLParser, foundCharacters string: String) { + if data != nil { + data! += string + } + } + + func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { + guard data != nil else { return } + switch elementName { + case "ds:X509Certificate": + if let data = Data(base64Encoded: data!, options: .ignoreUnknownCharacters) { + addressees.append(Addressee(cert: data)) + } + case "denc:EncryptionProperty": + if let filename = data!.split(separator: "|").first { + dataFiles.append(CryptoDataFile(filename: String(filename))) + } + default: break + } + data = nil + } +} diff --git a/CryptoLib/CryptoLib/XmlParser/DdocParserDelegate.m b/CryptoLib/CryptoLib/XmlParser/DdocParserDelegate.m deleted file mode 100644 index fb314e146..000000000 --- a/CryptoLib/CryptoLib/XmlParser/DdocParserDelegate.m +++ /dev/null @@ -1,79 +0,0 @@ -// -// DdocParserDelegate.m -// CryptoLib -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#if DEBUG -#define printLog(...) NSLog(__VA_ARGS__) -#else -#define printLog(...) -#endif - -#import "DdocParserDelegate.h" -@interface DdocParserDelegate () -@end - -@implementation DdocParserDelegate { - -} - -- (void) parserDidStartDocument:(NSXMLParser *)parser { - printLog(@"parserDidStartDocument"); -} - -- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { - printLog(@"didStartElement --> %@", elementName); - - if ([elementName isEqualToString:@"DataFile"]) { - if (_dictionary == nil){ - _dictionary = [NSMutableDictionary new]; - } - NSString *attribute = attributeDict[@"Filename"]; - [_dictionary setObject:@"" forKey:attribute]; - _lastKey = attribute; - printLog(@"didStartElement --> %@", attributeDict[@"Filename"]); - } -} - --(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { - - // If parsing ddoc original filenames, sometimes filename may contain new line symbols - if (string != nil && [string length] != 0 && ![string isEqualToString:@"\n "] && ![string isEqualToString:@"\n"]){ - string = [string stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]]; - if (_currentElement == nil ) { - _currentElement = [NSString new]; - } - _currentElement = [NSString stringWithFormat:@"%@%@", _currentElement, string]; - } - printLog(@"foundCharacters --> %@", string); -} - -- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { - if ([_currentElement length] != 0) { - [_dictionary setValue:_currentElement forKey:_lastKey]; - _currentElement = @""; - } - printLog(@"didEndElement --> %@", elementName); -} - -- (void) parserDidEndDocument:(NSXMLParser *)parser { - printLog(@"parserDidEndDocument"); -} -@end diff --git a/CryptoLib/build-cdoc.sh b/CryptoLib/build-cdoc.sh index 004965c83..2628634e1 100755 --- a/CryptoLib/build-cdoc.sh +++ b/CryptoLib/build-cdoc.sh @@ -3,19 +3,21 @@ export PATH=$PATH:/usr/local/bin:/opt/homebrew/bin SOURCE_DIR=${DERIVED_SOURCES_DIR}/cdoc if [ ! -d ${SOURCE_DIR} ]; then - git clone -b mopp https://github.com/metsma/cdoc.git ${SOURCE_DIR}; + git clone -b expire https://github.com/open-eid/libcdoc.git ${SOURCE_DIR}; fi cmake \ - -DINSTALL_FRAMEWORKDIR=${BUILT_PRODUCTS_DIR} \ + -DFRAMEWORK_DESTINATION=${BUILT_PRODUCTS_DIR} \ -DCMAKE_INSTALL_PREFIX=${BUILT_PRODUCTS_DIR} \ -DCMAKE_BUILD_TYPE=${CONFIGURATION} \ -DCMAKE_OSX_SYSROOT=${PLATFORM_NAME} \ -DCMAKE_OSX_ARCHITECTURES="${ARCHS// /;}" \ -DCMAKE_OSX_DEPLOYMENT_TARGET=${IPHONEOS_DEPLOYMENT_TARGET} \ -DBUILD_SHARED_LIBS=NO \ + -DBUILD_TOOLS=NO \ -DOPENSSL_ROOT_DIR=${PROJECT_DIR}/../MoppLib/MoppLib/libdigidocpp/libdigidocpp.${PLATFORM_NAME} \ -DCMAKE_DISABLE_FIND_PACKAGE_SWIG=YES \ -DCMAKE_DISABLE_FIND_PACKAGE_Doxygen=YES \ + -DCMAKE_DISABLE_FIND_PACKAGE_Boost=YES \ -S ${SOURCE_DIR} -B ${TARGET_TEMP_DIR} cmake --build ${TARGET_TEMP_DIR} cmake --install ${TARGET_TEMP_DIR} diff --git a/MoppApp/MoppApp.xcodeproj/project.pbxproj b/MoppApp/MoppApp.xcodeproj/project.pbxproj index 248e4f809..1093a7f69 100644 --- a/MoppApp/MoppApp.xcodeproj/project.pbxproj +++ b/MoppApp/MoppApp.xcodeproj/project.pbxproj @@ -2021,7 +2021,6 @@ "DEFAULT_CENTRAL_CONFIGURATION_UPDATE_INTERVAL=$(DEFAULT_CENTRAL_CONFIGURATION_UPDATE_INTERVAL)", ); GOOGLE_CONF_REQUIRED = YES; - HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = MoppApp/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -2031,7 +2030,6 @@ "$(inherited)", "-ObjC", ); - OTHER_SWIFT_FLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = ee.ria.digidoc; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = $APP_PROVISIONING_PROFILE; @@ -2070,7 +2068,6 @@ "DEFAULT_CENTRAL_CONFIGURATION_UPDATE_INTERVAL=$(DEFAULT_CENTRAL_CONFIGURATION_UPDATE_INTERVAL)", ); GOOGLE_CONF_REQUIRED = YES; - HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = MoppApp/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -2080,7 +2077,6 @@ "$(inherited)", "-ObjC", ); - OTHER_SWIFT_FLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = ee.ria.digidoc; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = $APP_PROVISIONING_PROFILE; diff --git a/MoppApp/MoppApp/AddresseeActions.swift b/MoppApp/MoppApp/AddresseeActions.swift index b9c310340..5d8e28df0 100644 --- a/MoppApp/MoppApp/AddresseeActions.swift +++ b/MoppApp/MoppApp/AddresseeActions.swift @@ -20,13 +20,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ -import Foundation + import ASN1Decoder -import CryptoLib protocol AddresseeActions { - func displayAddresseeType(_ type: X509Certificate.CertType?) -> String - func determineName(addressee: Addressee) -> String } extension AddresseeActions { @@ -35,18 +32,17 @@ extension AddresseeActions { if addressee.givenName == nil { return addressee.identifier } else { - return "\(addressee.surname.uppercased()), \(addressee.givenName.uppercased()), \(addressee.identifier.uppercased())" + return "\(addressee.surname?.uppercased() ?? ""), \(addressee.givenName?.uppercased() ?? ""), \(addressee.identifier.uppercased())" } } func determineInfo(addressee: Addressee) -> String { - let x509 = try? X509Certificate(der: addressee.cert) - let addresseeType = displayAddresseeType(x509?.certType()) - let validTo = "\(L(LocKey.cryptoValidTo)) \(MoppDateFormatter.shared.ddMMYYYY(toString: x509?.notAfter ?? Date()))" + let addresseeType = displayAddresseeType(addressee.certType) + let validTo = addressee.validTo != nil ? "\(L(LocKey.cryptoValidTo)) \(MoppDateFormatter.shared.ddMMYYYY(toString: addressee.validTo!))" : "" return "\(addresseeType) (\(validTo))" } - func displayAddresseeType(_ type: X509Certificate.CertType?) -> String { + func displayAddresseeType(_ type: CertType?) -> String { switch type { case .IDCardType: return L(.cryptoTypeIdCard) diff --git a/MoppApp/MoppApp/AddresseeViewController.swift b/MoppApp/MoppApp/AddresseeViewController.swift index 1f6b4124a..2a0173844 100644 --- a/MoppApp/MoppApp/AddresseeViewController.swift +++ b/MoppApp/MoppApp/AddresseeViewController.swift @@ -22,7 +22,6 @@ */ import Foundation -import CryptoLib protocol AddresseeViewControllerDelegate: AnyObject { func addAddresseeToContainer(selectedAddressees: [Addressee]) @@ -252,13 +251,7 @@ extension AddresseeViewController : UITableViewDataSource { cell.accessibilityLabel = "" cell.accessibilityUserInputLabels = [""] } - let isSelected = selectedAddressees.contains { element in - if ((element as Addressee).cert == (foundAddressees[row] as Addressee).cert) { - return true - } - return false - } - let isAddButtonDisabled = selectedIndexes.contains(row) || isSelected + let isAddButtonDisabled = selectedIndexes.contains(row) || selectedAddressees.contains(foundAddressees[row]) cell.populate(addressee: foundAddressees[row] as Addressee, index: row, isAddButtonDisabled: isAddButtonDisabled) if indexPath.row == 0 { UIAccessibility.post(notification: .layoutChanged, argument: cell) @@ -405,14 +398,9 @@ extension AddresseeViewController : ContainerFoundAddresseeCellDelegate { } func addAddresseeToSelectedArea(addressee: Addressee) { - if !selectedAddressees.contains(where: {( - ($0.givenName != nil && $0.givenName == addressee.givenName && - $0.surname != nil && $0.surname == addressee.surname) || - $0.identifier == addressee.identifier) && $0.cert == addressee.cert && $0.validTo == addressee.validTo - }) { + if !selectedAddressees.contains(addressee) { selectedAddressees.insert(addressee, at: 0) } - self.tableView.reloadData() } diff --git a/MoppApp/MoppApp/Configuration.swift b/MoppApp/MoppApp/Configuration.swift index 8d0037531..246360276 100644 --- a/MoppApp/MoppApp/Configuration.swift +++ b/MoppApp/MoppApp/Configuration.swift @@ -24,7 +24,6 @@ import Foundation import ASN1Decoder -import CryptoLib internal struct MOPPConfiguration: Codable { var TSLURL: String @@ -124,15 +123,15 @@ internal struct DefaultMoppConfiguration: Codable { public class MoppConfiguration { static var sivaUrl: String? static var tslUrl: String? - static var tslCerts: Array? - static var ldapCerts: Array? + static var tslCerts: [String]? + static var ldapCerts: [String]? static var tsaUrl: String? static var ocspIssuers: [String: String]? - static var certBundle: Array? + static var certBundle: [String]? static var tsaCert: String? static func getMoppLibConfiguration() -> MoppLibConfiguration { - return MoppLibConfiguration(configuration: sivaUrl, tslurl: tslUrl, tslcerts: tslCerts, ldapcerts: ldapCerts, tsaurl: tsaUrl, ocspissuers: ocspIssuers, certbundle: certBundle, tsacert: tsaCert) + return MoppLibConfiguration(sivaURL: sivaUrl ?? "", tslURL: tslUrl ?? "", tslCerts: tslCerts ?? [], ldapCerts: ldapCerts ?? [], tsaURL: tsaUrl ?? "", ocspIssuers: ocspIssuers ?? [:], certBundle: certBundle ?? [], tsaCert: tsaCert ?? "") } } diff --git a/MoppApp/MoppApp/ContainerActions.swift b/MoppApp/MoppApp/ContainerActions.swift index 055b7e3cc..16a8856cb 100644 --- a/MoppApp/MoppApp/ContainerActions.swift +++ b/MoppApp/MoppApp/ContainerActions.swift @@ -21,9 +21,7 @@ * */ -import Foundation import SkSigningLib -import CryptoLib protocol ContainerActions { func openExistingContainer(with url: URL, cleanup: Bool, isEmptyFileImported: Bool, isSendingToSivaAgreed: Bool) @@ -79,7 +77,7 @@ extension ContainerActions where Self: UIViewController { let ext = urls.first!.pathExtension if landingViewController.containerType == nil { - if ext.isCdocContainerExtension { + if ext.isCryptoContainerExtension { landingViewController.containerType = .cdoc } else { landingViewController.containerType = .asic @@ -88,7 +86,7 @@ extension ContainerActions where Self: UIViewController { let isAsicOrPadesContainer = (ext.isAsicContainerExtension || (ext == ContainerFormatPDF && SiVaUtil.isSignedPDF(url: urls.first! as CFURL))) && landingViewController.containerType == .asic - let isCdocContainer = ext.isCdocContainerExtension && landingViewController.containerType == .cdoc + let isCdocContainer = ext.isCryptoContainerExtension && landingViewController.containerType == .cdoc if (isAsicOrPadesContainer || isCdocContainer) && urls.count == 1 { SiVaUtil.setIsSentToSiva(isSent: false) @@ -181,29 +179,17 @@ extension ContainerActions where Self: UIViewController { printLog("Unable to delete contents of Documents/Inbox directory: \(error.localizedDescription)") } } else { - let containerViewController = CryptoContainerViewController.instantiate() - let container = CryptoContainer(filename: fileName as NSString, filePath: newFilePath as NSString) - - MoppLibCryptoActions.sharedInstance().parseCdocInfo( - newFilePath as String?, - success: {(_ cdocInfo: CdocInfo?) -> Void in - guard let strongCdocInfo = cdocInfo else { return } - container.addressees = strongCdocInfo.addressees as? [Addressee] ?? [] - container.dataFiles = strongCdocInfo.dataFiles - containerViewController.containerPath = newFilePath - containerViewController.state = .opened - containerViewController.container = container - containerViewController.isContainerEncrypted = true - landingViewController.importProgressViewController.dismissRecursively(animated: false, completion: { - navController?.pushViewController(containerViewController, animated: true) - }) - }, - failure: { _ in - DispatchQueue.main.async { - failure(nil) - } - } - ) + Decrypt.parseCdocInfo(withFullPath: newFilePath) { cdocInfo in + guard let strongCdocInfo = cdocInfo else { return failure(nil) } + let containerViewController = CryptoContainerViewController.instantiate() + containerViewController.containerPath = newFilePath + containerViewController.state = .opened + containerViewController.container = CryptoContainer(filename: fileName, filePath: newFilePath, cdocInfo: strongCdocInfo) + containerViewController.isContainerEncrypted = true + landingViewController.importProgressViewController.dismissRecursively(animated: false, completion: { + navController?.pushViewController(containerViewController, animated: true) + }) + } } url.stopAccessingSecurityScopedResource() } @@ -288,18 +274,14 @@ extension ContainerActions where Self: UIViewController { } else { let containerViewController = topSigningViewController as? CryptoContainerViewController dataFilePaths.forEach { - let filename = ($0 as NSString).lastPathComponent as NSString + let filename = ($0 as NSString).lastPathComponent if isDuplicatedFilename(container: (containerViewController?.container)!, filename: filename) { DispatchQueue.main.async { self.infoAlert(message: L(.containerDetailsFileAlreadyExists)) } return } - let dataFile = CryptoDataFile.init() - dataFile.filename = filename as String? - dataFile.filePath = $0 - - containerViewController?.container.dataFiles.add(dataFile) + containerViewController?.container.dataFiles.append(CryptoDataFile(filename: filename, filePath: $0)) } landingViewController.importProgressViewController.dismissRecursively(animated: false, completion: { @@ -323,15 +305,10 @@ extension ContainerActions where Self: UIViewController { } } - private func isDuplicatedFilename(container: CryptoContainer, filename: NSString) -> Bool { - for dataFile in container.dataFiles { - if let strongDataFile = dataFile as? CryptoDataFile { - if strongDataFile.filename as NSString == filename { - return true - } - } + private func isDuplicatedFilename(container: CryptoContainer, filename: String) -> Bool { + return container.dataFiles.contains { dataFile in + return dataFile.filename == filename } - return false } func createNewContainer(with url: URL, dataFilePaths: [String], isEmptyFileImported: Bool, startSigningWhenCreated: Bool = false, cleanUpDataFilesInDocumentsFolder: Bool = true) { @@ -418,14 +395,12 @@ extension ContainerActions where Self: UIViewController { ) } else { let containerViewController = CryptoContainerViewController.instantiate() - let container = CryptoContainer(filename: containerFilename as NSString, filePath: containerPath as NSString) + let container = CryptoContainer(filename: containerFilename , filePath: containerPath) containerViewController.containerPath = containerPath for dataFilePath in containerFilePaths { - let dataFile = CryptoDataFile.init() - dataFile.filename = FileUtil.getFileName(currentFileName: (dataFilePath as NSString).lastPathComponent) - dataFile.filePath = dataFilePath - container.dataFiles.add(dataFile) + container.dataFiles.append(CryptoDataFile( + filename: FileUtil.getFileName(currentFileName: (dataFilePath as NSString).lastPathComponent), filePath: dataFilePath)) } containerViewController.container = container diff --git a/MoppApp/MoppApp/ContainerAddAllButtonCell.swift b/MoppApp/MoppApp/ContainerAddAllButtonCell.swift index 957563394..e62dad4f7 100644 --- a/MoppApp/MoppApp/ContainerAddAllButtonCell.swift +++ b/MoppApp/MoppApp/ContainerAddAllButtonCell.swift @@ -22,7 +22,6 @@ */ import Foundation -import CryptoLib class ContainerAddAllButtonCell: UITableViewCell { diff --git a/MoppApp/MoppApp/ContainerAddresseeCell.swift b/MoppApp/MoppApp/ContainerAddresseeCell.swift index d21accfa7..53e0df30d 100644 --- a/MoppApp/MoppApp/ContainerAddresseeCell.swift +++ b/MoppApp/MoppApp/ContainerAddresseeCell.swift @@ -22,8 +22,6 @@ */ import Foundation -import UIKit -import CryptoLib protocol ContainerAddresseeCellDelegate : AnyObject { func removeAddressee(index: Int) diff --git a/MoppApp/MoppApp/ContainerFoundAddresseeCell.swift b/MoppApp/MoppApp/ContainerFoundAddresseeCell.swift index 4050b4e0a..cf896b2f9 100644 --- a/MoppApp/MoppApp/ContainerFoundAddresseeCell.swift +++ b/MoppApp/MoppApp/ContainerFoundAddresseeCell.swift @@ -22,7 +22,6 @@ */ import Foundation -import CryptoLib protocol ContainerFoundAddresseeCellDelegate : AnyObject { func addAddresseeToSelectedArea(index: Int, completionHandler: @escaping () -> Void) diff --git a/MoppApp/MoppApp/ContainerRemovalActions.swift b/MoppApp/MoppApp/ContainerRemovalActions.swift index a165da6e5..2105f0c9b 100644 --- a/MoppApp/MoppApp/ContainerRemovalActions.swift +++ b/MoppApp/MoppApp/ContainerRemovalActions.swift @@ -46,7 +46,7 @@ class ContainerRemovalActions { return false } - cryptoContainer.dataFiles.removeObject(at: 0) + cryptoContainer.dataFiles.remove(at: 0) return cryptoContainer.dataFiles.count == 0 } diff --git a/MoppApp/MoppApp/ContainerViewController.swift b/MoppApp/MoppApp/ContainerViewController.swift index 0319fc40a..145472d6c 100644 --- a/MoppApp/MoppApp/ContainerViewController.swift +++ b/MoppApp/MoppApp/ContainerViewController.swift @@ -22,8 +22,6 @@ */ import Foundation -import MoppLib -import CryptoLib protocol ContainerViewControllerDelegate: AnyObject { func getDataFileCount() -> Int @@ -42,8 +40,8 @@ protocol SigningContainerViewControllerDelegate: AnyObject { func startSigning() func getSignaturesCount() -> Int func getTimestampTokensCount() -> Int - func getSignature(index: Int) -> Any - func getTimestampToken(index: Int) -> Any + func getSignature(index: Int) -> MoppLibSignature? + func getTimestampToken(index: Int) -> MoppLibSignature? func removeSignature(index: Int) func isContainerSignable() -> Bool func isCades() -> Bool @@ -51,7 +49,7 @@ protocol SigningContainerViewControllerDelegate: AnyObject { protocol CryptoContainerViewControllerDelegate: AnyObject { func addAddressees() - func getAddressee(index: Int) -> Any + func getAddressee(index: Int) -> Addressee func getAddresseeCount() -> Int func removeSelectedAddressee(index: Int) func getContainer() -> CryptoContainer @@ -192,7 +190,7 @@ class ContainerViewController : MoppViewController, ContainerActions, PreviewAct let containerExtension = URL(fileURLWithPath: containerPath).pathExtension - LandingViewController.shared.containerType = containerExtension.isCdocContainerExtension ? .cdoc : .asic + LandingViewController.shared.containerType = containerExtension.isCryptoContainerExtension ? .cdoc : .asic landingViewController.tabButtonsDelegate = self @@ -337,8 +335,7 @@ class ContainerViewController : MoppViewController, ContainerActions, PreviewAct if let dataFiles = asicContainer?.dataFiles, !isEmptyFileWarningSet { var isEmptyFileInContainer = false for dataFile in dataFiles { - guard let dataFile = dataFile as? MoppLibDataFile, - dataFile.fileSize == 0 else { continue } + guard dataFile.fileSize == 0 else { continue } isEmptyFileInContainer = true break } @@ -376,12 +373,9 @@ class ContainerViewController : MoppViewController, ContainerActions, PreviewAct } } - static func isXades(signatures: [Any]) -> Bool { + static func isXades(signatures: [MoppLibSignature]) -> Bool { return signatures.contains { signature in - if let sig = signature as? MoppLibSignature { - return sig.signatureFormat.lowercased().contains("bes") - } - return false + return signature.signatureFormat.lowercased().contains("bes") } } @@ -506,10 +500,8 @@ extension ContainerViewController : UITableViewDataSource { guard let calendarDate = calendar.date(from: dateComponents) else { printLog("Unable to get date from calendar components"); DefaultsHelper.isTimestampedDdoc = false; return } if signingContainer.isAsics(), signingContainer.dataFiles.count == 1, signingContainer.signatures.count == 1, - let singleFile: MoppLibDataFile = signingContainer.dataFiles[0] as? MoppLibDataFile, - singleFile.fileName.hasSuffix(ContainerFormatDdoc), - let singleSignature: MoppLibSignature = signingContainer.signatures[0] as? MoppLibSignature, - let timestamp = ISO8601DateFormatter().date(from: singleSignature.timestamp) { + signingContainer.dataFiles[0].fileName.hasSuffix(ContainerFormatDdoc), + let timestamp = ISO8601DateFormatter().date(from: signingContainer.signatures[0].timestamp) { DefaultsHelper.isTimestampedDdoc = !timestamp.isAfter(anotherDate: calendarDate) return } else if signingContainer.isDdoc(), state != .preview { @@ -540,7 +532,7 @@ extension ContainerViewController : UITableViewDataSource { let cell = tableView.dequeueReusableCell(withType: ContainerSignatureCell.self, for: indexPath)! cell.delegate = self cell.accessibilityUserInputLabels = ["\(L(.voiceControlSignature)) \(row + 1)"] - var signature = asicsSignatures.isEmpty ? (signingContainerViewDelegate.getSignature(index: indexPath.row) as? MoppLibSignature) : asicsSignatures[indexPath.row] + var signature = asicsSignatures.isEmpty ? signingContainerViewDelegate.getSignature(index: indexPath.row) : asicsSignatures[indexPath.row] if isAsicsContainer() && !asicsSignatures.isEmpty && signingContainerViewDelegate.getTimestampTokensCount() > 0 && asicsSignatures.count >= indexPath.row { signature = asicsSignatures[indexPath.row] let containerExtension: String = URL(fileURLWithPath: containerPath).pathExtension @@ -592,7 +584,7 @@ extension ContainerViewController : UITableViewDataSource { var tapGesture: UITapGestureRecognizer? if isAsicsContainer() && !asicsDataFiles.isEmpty && asicsDataFiles.count >= indexPath.row { - dataFileName = asicsDataFiles[indexPath.row].fileName ?? unnamedDataFile + dataFileName = asicsDataFiles[indexPath.row].fileName tapGesture = getPreviewTapGesture(dataFile: dataFileName, containerPath: asicsNestedContainerPath, isShareButtonNeeded: isDecrypted) } else { dataFileName = containerViewDelegate.getDataFileDisplayName(index: indexPath.row) ?? unnamedDataFile @@ -674,7 +666,7 @@ extension ContainerViewController : UITableViewDataSource { cell.delegate = self let isStatePreviewOrOpened = state == .opened || state == .preview let isRemoveButtonHidden = !isAsicContainer && isStatePreviewOrOpened - cell.populate(addressee: cryptoContainerViewDelegate.getAddressee(index: indexPath.row) as! Addressee, + cell.populate(addressee: cryptoContainerViewDelegate.getAddressee(index: indexPath.row), index: row, showRemoveButton: !isRemoveButtonHidden) cell.accessibilityUserInputLabels = [""] @@ -690,9 +682,9 @@ extension ContainerViewController : UITableViewDataSource { case .containerTimestamps: let cell = tableView.dequeueReusableCell(withType: ContainerSignatureCell.self, for: indexPath)! cell.accessibilityUserInputLabels = ["\(L(.voiceControlContainerTimestamp)) \(row + 1)"] - var timestampToken: MoppLibSignature = MoppLibSignature() + var timestampToken = MoppLibSignature() if signingContainerViewDelegate.getTimestampTokensCount() >= indexPath.row { - timestampToken = signingContainerViewDelegate.getTimestampToken(index: indexPath.row) as? MoppLibSignature ?? MoppLibSignature() + timestampToken = signingContainerViewDelegate.getTimestampToken(index: indexPath.row) ?? MoppLibSignature() if (containerViewDelegate.getDataFileCount() == 1 && isSendingToSivaAgreed && !isLoadingNestedAsicsDone && !MimeTypeExtractor.isCadesContainer(filePath: URL(fileURLWithPath: containerViewDelegate.getContainerPath()))) { @@ -700,7 +692,7 @@ extension ContainerViewController : UITableViewDataSource { let dataFile = containerViewDelegate.getDataFileDisplayName(index: 0) ?? "" let containerFilePath = containerViewDelegate.getContainerPath() let destinationPath = MoppFileManager.shared.tempFilePath(withFileName: dataFile) - self.openNestedContainer(containerFilePath: containerFilePath, dataFile: dataFile, destinationPath: destinationPath) + self.openNestedContainer(containerFilePath: containerFilePath, dataFile: dataFile, destinationPath: destinationPath ?? "") } else if (!isLoadingNestedAsicsDone) { cell.populate( with: timestampToken, @@ -746,22 +738,18 @@ extension ContainerViewController : UITableViewDataSource { tableView.scrollToRow(at: indexPath, at: .bottom, animated: true) } - private func openNestedContainer(containerFilePath: String, dataFile: String, destinationPath: String?) { + private func openNestedContainer(containerFilePath: String, dataFile: String, destinationPath: String) { MoppLibContainerActions.sharedInstance().container(containerFilePath, saveDataFile: dataFile, to: destinationPath) { MoppLibContainerActions.sharedInstance().openContainer(withPath: destinationPath) { container in - if let signatures = container?.signatures { - for signature in signatures { - self.asicsSignatures.append(signature as? MoppLibSignature ?? MoppLibSignature()) - } + for signature in container.signatures { + self.asicsSignatures.append(signature) } - if let dataFiles = container?.dataFiles { - for dataFile in dataFiles { - self.asicsDataFiles.append(dataFile as? MoppLibDataFile ?? MoppLibDataFile()) - } + for dataFile in container.dataFiles { + self.asicsDataFiles.append(dataFile) } - self.asicsNestedContainerPath = destinationPath ?? "" + self.asicsNestedContainerPath = destinationPath self.isLoadingNestedAsicsDone = true @@ -786,7 +774,7 @@ extension ContainerViewController : UITableViewDataSource { } } failure: { error in - printLog("Unable to get file from container \(error?.localizedDescription ?? "Unable to get error description")") + printLog("Unable to get file from container \(error.localizedDescription)") let nserror = error as NSError? if nserror != nil && nserror?.code == MoppLibErrorCode.moppLibErrorNoInternetConnection.rawValue { let pathExtension = URL(string: containerFilePath)?.pathExtension @@ -813,8 +801,10 @@ extension ContainerViewController : UITableViewDataSource { } func isRoleDetailsEmpty(signatureIndex: Int) -> Bool { - let roleDetails = getRoleDetails(signatureIndex: signatureIndex) - return roleDetails?.roles.isEmpty ?? true && roleDetails?.city.isNilOrEmpty ?? true && roleDetails?.state.isNilOrEmpty ?? true && roleDetails?.country.isNilOrEmpty ?? true && roleDetails?.zip.isNilOrEmpty ?? true + if let roleDetails = getRoleDetails(signatureIndex: signatureIndex) { + return roleDetails.roles.isEmpty && roleDetails.city.isEmpty && roleDetails.state.isEmpty && roleDetails.country.isEmpty && roleDetails.zip.isEmpty + } + return true } @objc private func openPreview(_ sender: PreviewFileTapGestureRecognizer) { @@ -858,10 +848,9 @@ extension ContainerViewController : ContainerFileDelegate { extension ContainerViewController : ContainerHeaderDelegate { private func asicContainerExists(container: MoppLibContainer?) -> Bool { - guard let signingContainer: MoppLibContainer = container, - let signingContainerFilePath = signingContainer.filePath, - !(signingContainerFilePath as String).isEmpty, - URL(fileURLWithPath: signingContainerFilePath).pathExtension != ContainerFormatCdoc else { + guard let signingContainer = container, + !signingContainer.filePath.isEmpty, + URL(fileURLWithPath: signingContainer.filePath).pathExtension != ContainerFormatCdoc else { return false } @@ -869,10 +858,9 @@ extension ContainerViewController : ContainerHeaderDelegate { } private func cdocContainerExists(container: CryptoContainer?) -> Bool { - guard let cryptoContainer: CryptoContainer = container, - let cryptoContainerFilePath = cryptoContainer.filePath, - !(cryptoContainerFilePath as String).isEmpty, - URL(fileURLWithPath: cryptoContainerFilePath as String).pathExtension == ContainerFormatCdoc else { + guard let cryptoContainer = container, + !cryptoContainer.filePath.isEmpty, + URL(fileURLWithPath: cryptoContainer.filePath).pathExtension == ContainerFormatCdoc else { return false } @@ -961,8 +949,8 @@ extension ContainerViewController : ContainerHeaderDelegate { self.infoAlert(message: L(.containerErrorMessageFailedContainerNameChange)) return } - cryptoContainer.filename = newContainerPath.lastPathComponent as NSString - cryptoContainer.filePath = newContainerPath.path as NSString + cryptoContainer.filename = newContainerPath.lastPathComponent + cryptoContainer.filePath = newContainerPath.path } printLog("File renaming successful") @@ -1169,11 +1157,11 @@ extension ContainerViewController : UITableViewDelegate { if !asicsSignatures.isEmpty && asicsSignatures.indices.contains(indexPathRow) { return asicsSignatures[indexPathRow] } - return signingContainerViewDelegate.getSignature(index: indexPathRow) as? MoppLibSignature + return signingContainerViewDelegate.getSignature(index: indexPathRow) } private func getTimestampToken(indexPathRow: Int) -> MoppLibSignature? { - return signingContainerViewDelegate.getTimestampToken(index: indexPathRow) as? MoppLibSignature + return signingContainerViewDelegate.getTimestampToken(index: indexPathRow) } private func isCades() -> Bool { diff --git a/MoppApp/MoppApp/CryptoActions.swift b/MoppApp/MoppApp/CryptoActions.swift index 29ca969f9..93199c80e 100644 --- a/MoppApp/MoppApp/CryptoActions.swift +++ b/MoppApp/MoppApp/CryptoActions.swift @@ -20,8 +20,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ + import Foundation -import CryptoLib protocol CryptoActions { func startEncryptingProcess() @@ -31,36 +31,31 @@ protocol CryptoActions { extension CryptoActions where Self: CryptoContainerViewController { func startEncryptingProcess() { - if container.addressees.count > 0 { - MoppLibCryptoActions.sharedInstance().encryptData( - container.filePath as String?, - withDataFiles: container.dataFiles as? [Any], - withAddressees: container.addressees, - success: { - self.isCreated = false - self.isForPreview = false - self.isContainerEncrypted = true - self.state = .loading - self.containerViewDelegate.openContainer(afterSignatureCreated: true) - UIAccessibility.post(notification: UIAccessibility.Notification.screenChanged, argument: L(.cryptoEncryptionSuccess)) - let encryptionSuccess = NotificationMessage(isSuccess: true, text: L(.cryptoEncryptionSuccess)) - if !self.notifications.contains(where: { $0 == encryptionSuccess }) { - self.notifications.append(encryptionSuccess) - } - self.reloadCryptoData() + guard container.addressees.count > 0 else { + return self.infoAlert(message: L(.cryptoNoAddresseesWarning)) + } + Encrypt.encryptFile(container.filePath, + with: container.dataFiles, + with: container.addressees, + success: { + self.isCreated = false + self.isForPreview = false + self.isContainerEncrypted = true + self.state = .loading + self.containerViewDelegate.openContainer(afterSignatureCreated: true) + UIAccessibility.post(notification: UIAccessibility.Notification.screenChanged, argument: L(.cryptoEncryptionSuccess)) + let encryptionSuccess = NotificationMessage(isSuccess: true, text: L(.cryptoEncryptionSuccess)) + if !self.notifications.contains(where: { $0 == encryptionSuccess }) { + self.notifications.append(encryptionSuccess) + } + self.reloadCryptoData() - MoppFileManager.removeFiles() - + MoppFileManager.removeFiles() }, - failure: { _ in - DispatchQueue.main.async { - self.infoAlert(message: L(.cryptoEncryptionErrorText)) - } - } - ) - } else { - self.infoAlert(message: L(.cryptoNoAddresseesWarning)) - } + failure: { + self.infoAlert(message: L(.cryptoEncryptionErrorText)) + } + ) } func startDecryptingProcess() { let decryptSelectionVC = UIStoryboard.tokenFlow.instantiateViewController(of: TokenFlowSelectionViewController.self) @@ -75,21 +70,18 @@ extension CryptoActions where Self: CryptoContainerViewController { extension CryptoContainerViewController : IdCardDecryptViewControllerDelegate { - func idCardDecryptDidFinished(cancelled: Bool, success: Bool, dataFiles: NSMutableDictionary, error: Error?) { + func idCardDecryptDidFinished(cancelled: Bool, success: Bool, dataFiles: [String: Data], error: Error?) { if !cancelled { if success { - container.dataFiles.removeAllObjects() + container.dataFiles.removeAll() for dataFile in dataFiles { - let cryptoDataFile = CryptoDataFile() - cryptoDataFile.filename = dataFile.key as? String - guard let destinationPath = MoppFileManager.shared.tempFilePath(withFileName: cryptoDataFile.filename) else { + guard let destinationPath = MoppFileManager.shared.tempFilePath(withFileName: dataFile.key) else { dismiss(animated: false) infoAlert(message: L(.decryptionErrorMessage)) return } - cryptoDataFile.filePath = destinationPath - container.dataFiles.add(cryptoDataFile) - MoppFileManager.shared.createFile(atPath: destinationPath, contents: dataFile.value as! Data) + container.dataFiles.append(CryptoDataFile(filename: dataFile.key, filePath: destinationPath)) + MoppFileManager.shared.createFile(atPath: destinationPath, contents: dataFile.value) } self.isCreated = false diff --git a/MoppApp/MoppApp/CryptoContainer.swift b/MoppApp/MoppApp/CryptoContainer.swift index 067be9355..7770f8c94 100644 --- a/MoppApp/MoppApp/CryptoContainer.swift +++ b/MoppApp/MoppApp/CryptoContainer.swift @@ -21,20 +21,18 @@ * */ -import Foundation -import CryptoLib - class CryptoContainer { - - var filename: NSString! - var filePath: NSString! - var dataFiles: NSMutableArray = [] - var addressees: [Addressee] = [] - - init(filename: NSString, filePath: NSString){ + + var filename: String + var filePath: String + var dataFiles: [CryptoDataFile] + var addressees: [Addressee] + + init(filename: String, filePath: String, cdocInfo: CdocInfo? = nil) { self.filename = filename self.filePath = filePath + self.dataFiles = cdocInfo?.dataFiles ?? [] + self.addressees = cdocInfo?.addressees ?? [] } - } diff --git a/MoppApp/MoppApp/CryptoContainerViewController.swift b/MoppApp/MoppApp/CryptoContainerViewController.swift index 5c6d40cb0..e44cc11d7 100644 --- a/MoppApp/MoppApp/CryptoContainerViewController.swift +++ b/MoppApp/MoppApp/CryptoContainerViewController.swift @@ -21,9 +21,6 @@ * */ -import UIKit -import CryptoLib - class CryptoContainerViewController : ContainerViewController, CryptoActions { var container: CryptoContainer! @@ -84,7 +81,7 @@ extension CryptoContainerViewController : CryptoContainerViewControllerDelegate reloadCryptoData() } - func getAddressee(index: Int) -> Any { + func getAddressee(index: Int) -> Addressee { return container.addressees[index] } @@ -113,7 +110,7 @@ extension CryptoContainerViewController : AddresseeViewControllerDelegate { extension CryptoContainerViewController : ContainerViewControllerDelegate { func removeDataFile(index: Int) { - let containerFileCount: Int = self.getContainer().dataFiles.count + let containerFileCount: Int = (self.getContainer() as CryptoContainer).dataFiles.count guard containerFileCount > 0 else { printLog("No files in container") self.infoAlert(message: "File not found in container") @@ -151,7 +148,7 @@ extension CryptoContainerViewController : ContainerViewControllerDelegate { strongSelf.updateState(.loading) strongSelf.updateState((self?.isCreated)! ? .created : .opened) if strongSelf.container.dataFiles.count > index { - strongSelf.container.dataFiles.removeObject(at: index) + strongSelf.container.dataFiles.remove(at: index) } else { self?.infoAlert(message: L(.dataFileRemovalFailed)) return @@ -188,13 +185,11 @@ extension CryptoContainerViewController : ContainerViewControllerDelegate { } func getDataFileDisplayName(index: Int) -> String? { - guard let dataFile = (container.dataFiles[index] as? CryptoDataFile) else { - return nil - } + let dataFile = container.dataFiles[index] if dataFile.filePath == nil { return dataFile.filename } - return (dataFile.filePath as NSString).lastPathComponent + return (dataFile.filePath! as NSString).lastPathComponent } func getContainer() -> MoppLibContainer { @@ -214,28 +209,14 @@ extension CryptoContainerViewController : ContainerViewControllerDelegate { if state != .loading { return } if container == nil { let filePath = containerPath as NSString - let container = CryptoContainer(filename: filePath.lastPathComponent as NSString, filePath: filePath) - MoppLibCryptoActions.sharedInstance().parseCdocInfo( - filePath as String?, - success: {(_ cdocInfo: CdocInfo?) -> Void in - guard let strongCdocInfo = cdocInfo else { return } - - container.addressees = strongCdocInfo.addressees as? [Addressee] ?? [] - container.dataFiles = strongCdocInfo.dataFiles - self.containerPath = filePath as String? - self.state = .opened - - self.container = container - self.isDecrypted = false - self.reloadCryptoData() - }, - failure: { _ in - DispatchQueue.main.async { - self.infoAlert(message: L(.fileImportOpenExistingFailedAlertMessage, [filePath.lastPathComponent])) - } - } - ) - + Decrypt.parseCdocInfo(withFullPath: filePath as String) { cdocInfo in + guard let strongCdocInfo = cdocInfo else { return self.infoAlert(message: L(.fileImportOpenExistingFailedAlertMessage, [filePath.lastPathComponent])) } + self.containerPath = filePath as String + self.state = .opened + self.container = CryptoContainer(filename: filePath.lastPathComponent, filePath: filePath as String, cdocInfo: strongCdocInfo) + self.isDecrypted = false + self.reloadCryptoData() + } } self.notifications = [] self.updateState(self.isCreated ? .created : .opened) @@ -246,7 +227,7 @@ extension CryptoContainerViewController : ContainerViewControllerDelegate { } func getDataFileRelativePath(index: Int) -> String { - return (container.dataFiles[index] as! CryptoDataFile).filename! as String + return container.dataFiles[index].filename } func isContainerEmpty() -> Bool { diff --git a/MoppApp/MoppApp/DefaultsHelper.swift b/MoppApp/MoppApp/DefaultsHelper.swift index fdcd7fcb8..34d65e18a 100644 --- a/MoppApp/MoppApp/DefaultsHelper.swift +++ b/MoppApp/MoppApp/DefaultsHelper.swift @@ -34,6 +34,7 @@ let ContainerFormatAsics = "asics" let ContainerFormatAsicsShort = "scs" let ContainerFormatPDF = "pdf" let ContainerFormatCdoc = "cdoc" +let ContainerFormatCdoc2 = "cdoc2" let ContainerFormatP12d = "p12d" let FileFormatXml = "xml" diff --git a/MoppApp/MoppApp/Extensions/String+Additions.swift b/MoppApp/MoppApp/Extensions/String+Additions.swift index 0903c67ed..a0c9a0803 100644 --- a/MoppApp/MoppApp/Extensions/String+Additions.swift +++ b/MoppApp/MoppApp/Extensions/String+Additions.swift @@ -77,11 +77,12 @@ extension String { var isPdfContainerExtension: Bool { return self.lowercased() == ContainerFormatPDF } - - var isCdocContainerExtension: Bool { - return self.lowercased() == ContainerFormatCdoc + + var isCryptoContainerExtension: Bool { + return caseInsensitiveCompare(ContainerFormatCdoc) == .orderedSame || + caseInsensitiveCompare(ContainerFormatCdoc2) == .orderedSame } - + var isXmlFileExtension: Bool { return self.lowercased() == FileFormatXml } @@ -250,9 +251,6 @@ extension String { extension Optional where Wrapped == String { var isNilOrEmpty:Bool { - if let value = self, !value.isEmpty { - return false - } - return true + return self?.isEmpty ?? true } } diff --git a/MoppApp/MoppApp/FileManager.swift b/MoppApp/MoppApp/FileManager.swift index 274eff456..ed6377047 100644 --- a/MoppApp/MoppApp/FileManager.swift +++ b/MoppApp/MoppApp/FileManager.swift @@ -276,7 +276,7 @@ class MoppFileManager { completionHandler(true, saveTempFileToLocation) return }, failure: { (error) in - printLog("Failed to save file. Error: \(error?.localizedDescription ?? "No error to display")") + printLog("Failed to save file. Error: \(error.localizedDescription ?? "No error to display")") completionHandler(false, nil) return }) diff --git a/MoppApp/MoppApp/IDCardSignature.swift b/MoppApp/MoppApp/IDCardSignature.swift index 10a9be002..0e296cb54 100644 --- a/MoppApp/MoppApp/IDCardSignature.swift +++ b/MoppApp/MoppApp/IDCardSignature.swift @@ -29,7 +29,7 @@ class IDCardSignature { func createIDCardSignature(idCardParameters: IDCardParameters?, completionHandler: @escaping (Result) -> Void) { MoppLibContainerActions.sharedInstance().addSignature(idCardParameters?.containerPath, withPin2:idCardParameters?.pin2, roleData: idCardParameters?.roleData, success: { container in - completionHandler(.success(container!)) + completionHandler(.success(container)) }, failure: { error in guard let nsError = error as NSError? else { return } completionHandler(.failure(nsError)) diff --git a/MoppApp/MoppApp/IdCardViewController.swift b/MoppApp/MoppApp/IdCardViewController.swift index 6a382af86..bb59dbef1 100644 --- a/MoppApp/MoppApp/IdCardViewController.swift +++ b/MoppApp/MoppApp/IdCardViewController.swift @@ -34,7 +34,7 @@ protocol IdCardSignViewControllerDelegate : AnyObject { } protocol IdCardDecryptViewControllerDelegate : AnyObject { - func idCardDecryptDidFinished(cancelled: Bool, success: Bool, dataFiles: NSMutableDictionary, error: Error?) + func idCardDecryptDidFinished(cancelled: Bool, success: Bool, dataFiles: [String: Data], error: Error?) } class IdCardViewController : MoppViewController, TokenFlowSigning { @@ -437,47 +437,39 @@ class IdCardViewController : MoppViewController, TokenFlowSigning { state = .tokenActionInProcess if isActionDecryption { - MoppLibCryptoActions.sharedInstance().decryptData(containerPath, withPin1: pin, - success: {(_ decryptedData: NSMutableDictionary?) -> Void in - guard let strongDecryptedData = decryptedData else { return } - self.decryptDelegate?.idCardDecryptDidFinished(cancelled: false, success: true, dataFiles: strongDecryptedData, error: nil) - }, - failure: { [weak self] error in - guard let nsError = error as NSError? else { return } - if nsError.code == MoppLibErrorCode.moppLibErrorWrongPin.rawValue { - DispatchQueue.main.async { - self?.pinAttemptsLeft = (nsError.userInfo[MoppLibError.kMoppLibUserInfoRetryCount] as? NSNumber)?.uintValue ?? 0 - self?.state = .wrongPin - } + Task { + do { + let decryptedData = try await MoppLibCryptoActions.decryptData(fullPath: containerPath, pin1: pin) + self.decryptDelegate?.idCardDecryptDidFinished(cancelled: false, success: true, dataFiles: decryptedData, error: nil) + } catch { + if let nsError = error as NSError?, + nsError.code == MoppLibErrorCode.moppLibErrorWrongPin.rawValue { // Wrong PIN1 error + self.pinAttemptsLeft = (nsError.userInfo[MoppLibError.kMoppLibUserInfoRetryCount] as? NSNumber)?.uintValue ?? 0 + self.state = .wrongPin } else { - DispatchQueue.main.async { - self?.dismiss(animated: false, completion: { - self?.decryptDelegate?.idCardDecryptDidFinished(cancelled: false, success: false, dataFiles: NSMutableDictionary(), error: error) - }) - } + self.dismiss(animated: false, completion: { + self.decryptDelegate?.idCardDecryptDidFinished(cancelled: false, success: false, dataFiles: [:], error: error) + }) } } - ) - + } + } else if DefaultsHelper.isRoleAndAddressEnabled { + let roleAndAddressView = UIStoryboard.tokenFlow.instantiateViewController(of: RoleAndAddressViewController.self) + roleAndAddressView.modalPresentationStyle = .overCurrentContext + roleAndAddressView.modalTransitionStyle = .crossDissolve + roleAndAddressView.viewController = self + if !savePin(pin: pin) { + showPinSaveError() + return + } + present(roleAndAddressView, animated: true) } else { - if DefaultsHelper.isRoleAndAddressEnabled { - let roleAndAddressView = UIStoryboard.tokenFlow.instantiateViewController(of: RoleAndAddressViewController.self) - roleAndAddressView.modalPresentationStyle = .overCurrentContext - roleAndAddressView.modalTransitionStyle = .crossDissolve - roleAndAddressView.viewController = self - if !savePin(pin: pin) { - showPinSaveError() - return - } - present(roleAndAddressView, animated: true) - } else { - if !savePin(pin: pin) { - showPinSaveError() - return - } - - self.sign(pin) + if !savePin(pin: pin) { + showPinSaveError() + return } + + self.sign(pin) } } diff --git a/MoppApp/MoppApp/Info.plist b/MoppApp/MoppApp/Info.plist index 7fc47a80f..4a73aec60 100644 --- a/MoppApp/MoppApp/Info.plist +++ b/MoppApp/MoppApp/Info.plist @@ -83,6 +83,21 @@ ee.ria.digidoc-cdoc + + CFBundleIconFiles + + digidoc_76.png + digidoc_1024.png + + CFBundleTypeName + DigiDoc file cdoc2 + LSHandlerRank + Owner + LSItemContentTypes + + ee.ria.digidoc-cdoc2 + + CFBundleIconFiles @@ -439,6 +454,35 @@ + + CFBundleIconFiles + + digidoc_76.png + digidoc_1024.png + + UTTypeConformsTo + + public.data + + UTTypeDescription + DigiDoc Container cdoc2 + UTTypeIconFiles + + UTTypeIdentifier + ee.ria.digidoc-cdoc2 + UTTypeTagSpecification + + public.filename-extension + + cdoc2 + CDOC2 + + public.mime-type + + application/x-cdoc2 + + + CFBundleIconFiles @@ -768,6 +812,36 @@ + + CFBundleIconFiles + + digidoc_76.png + digidoc_1024.png + + UTTypeConformsTo + + public.data + public.cdoc2 + + UTTypeDescription + Digidoc Container cdoc2 + UTTypeIconFiles + + UTTypeIdentifier + ee.ria.digidoc + UTTypeTagSpecification + + public.filename-extension + + cdoc2 + CDOC2 + + public.mime-type + + application/x-cdoc2 + + + CFBundleIconFiles diff --git a/MoppApp/MoppApp/InitializationViewController.swift b/MoppApp/MoppApp/InitializationViewController.swift index 1b266b551..5d2207c88 100644 --- a/MoppApp/MoppApp/InitializationViewController.swift +++ b/MoppApp/MoppApp/InitializationViewController.swift @@ -42,7 +42,7 @@ class InitializationViewController : UIViewController { MoppApp.instance.setupTabController() } }, - andTSUrl: DefaultsHelper.timestampUrl ?? MoppConfiguration.getMoppLibConfiguration().tsaurl, + andTSUrl: DefaultsHelper.timestampUrl ?? MoppConfiguration.getMoppLibConfiguration().tsaURL, withMoppConfiguration: MoppConfiguration.getMoppLibConfiguration(), andProxyConfiguration: ManualProxy.getMoppLibProxyConfiguration() ) diff --git a/MoppApp/MoppApp/ManualProxy.swift b/MoppApp/MoppApp/ManualProxy.swift index b38dd78b4..1d5205673 100644 --- a/MoppApp/MoppApp/ManualProxy.swift +++ b/MoppApp/MoppApp/ManualProxy.swift @@ -40,8 +40,8 @@ public class ManualProxy { let manualProxy = ManualProxy.getManualProxyConfiguration() if manualProxy.setting == .systemProxy { let systemProxySettings = ProxyUtil.getSystemProxySettings() - return MoppLibProxyConfiguration(configuration: systemProxySettings.setting.rawValue, host: systemProxySettings.host, port: NSNumber(value: systemProxySettings.port), username: systemProxySettings.username, password: systemProxySettings.password) + return MoppLibProxyConfiguration(username: systemProxySettings.username, password: systemProxySettings.password) } - return MoppLibProxyConfiguration(configuration: manualProxy.setting.rawValue, host: manualProxy.host, port: NSNumber(value: manualProxy.port), username: manualProxy.username, password: manualProxy.password) + return MoppLibProxyConfiguration(username: manualProxy.username, password: manualProxy.password) } } diff --git a/MoppApp/MoppApp/MoppApp-Bridging-Header.h b/MoppApp/MoppApp/MoppApp-Bridging-Header.h index 236d6c23c..5f03c912b 100644 --- a/MoppApp/MoppApp/MoppApp-Bridging-Header.h +++ b/MoppApp/MoppApp/MoppApp-Bridging-Header.h @@ -3,5 +3,5 @@ // #import -#import +#import #import diff --git a/MoppApp/MoppApp/MoppApp.swift b/MoppApp/MoppApp/MoppApp.swift index 80757fed0..bdfdf0af1 100644 --- a/MoppApp/MoppApp/MoppApp.swift +++ b/MoppApp/MoppApp/MoppApp.swift @@ -383,7 +383,7 @@ class MoppApp: UIApplication, URLSessionDelegate, URLSessionDownloadDelegate { } } - if newUrl.pathExtension.isCdocContainerExtension && urls.count == 1 { + if newUrl.pathExtension.isCryptoContainerExtension && urls.count == 1 { landingViewController?.containerType = .cdoc } else { landingViewController?.containerType = .asic diff --git a/MoppApp/MoppApp/MyeIDChangeCodesViewController.swift b/MoppApp/MoppApp/MyeIDChangeCodesViewController.swift index aee86dcf5..07becf733 100644 --- a/MoppApp/MoppApp/MyeIDChangeCodesViewController.swift +++ b/MoppApp/MoppApp/MyeIDChangeCodesViewController.swift @@ -79,7 +79,7 @@ extension MyeIDChangeCodesViewController: MyeIDChangeCodesViewControllerUIDelega if let nsError = error as NSError? { let actionType = strongSelf.model.actionType let errorCode = nsError.code - + if errorCode == MoppLibErrorCode.moppLibErrorWrongPin.rawValue { let retryCount = (nsError.userInfo[MoppLibError.kMoppLibUserInfoRetryCount] as? NSNumber)?.intValue ?? 0 strongSelf.infoManager.retryCounts.setRetryCount(for: actionType, with: retryCount) diff --git a/MoppApp/MoppApp/MyeIDInfoManager.swift b/MoppApp/MoppApp/MyeIDInfoManager.swift index 68429f0f8..ee24f237d 100644 --- a/MoppApp/MoppApp/MyeIDInfoManager.swift +++ b/MoppApp/MoppApp/MyeIDInfoManager.swift @@ -226,7 +226,7 @@ class MyeIDInfoManager { UIAccessibility.post(notification: UIAccessibility.Notification.screenChanged, argument: "") } - func organizationDisplayString(_ certOrganization: X509Certificate.CertType?) -> String { + func organizationDisplayString(_ certOrganization: CertType?) -> String { switch certOrganization { case .IDCardType: return L(.myEidInfoMyEidIdCard) diff --git a/MoppApp/MoppApp/PreviewActions.swift b/MoppApp/MoppApp/PreviewActions.swift index 883bacc34..f06cad38f 100644 --- a/MoppApp/MoppApp/PreviewActions.swift +++ b/MoppApp/MoppApp/PreviewActions.swift @@ -163,14 +163,14 @@ extension PreviewActions where Self: ContainerViewController { } else { openAsicContainerPreview(isPDF) } - } else if dataFileExt.isCdocContainerExtension { + } else if dataFileExt.isCryptoContainerExtension { openCdocContainerPreview() } else { openContentPreview(destinationPath) } }, failure: { [weak self] error in - self?.infoAlert(message: error?.localizedDescription) + self?.infoAlert(message: error.localizedDescription) }) } else { self.notifications = [] @@ -186,7 +186,7 @@ extension PreviewActions where Self: ContainerViewController { } else { openAsicContainerPreview(isPDF) } - } else if dataFileExt.isCdocContainerExtension { + } else if dataFileExt.isCryptoContainerExtension { openCdocContainerPreview() } else { openContentPreview(destinationPath) diff --git a/MoppApp/MoppApp/RecentContainersViewController.swift b/MoppApp/MoppApp/RecentContainersViewController.swift index b0b4106a0..9c117a08c 100644 --- a/MoppApp/MoppApp/RecentContainersViewController.swift +++ b/MoppApp/MoppApp/RecentContainersViewController.swift @@ -21,8 +21,6 @@ * */ -import UIKit -import CryptoLib class RecentContainersViewController : MoppModalViewController { var requestCloseSearch: (() -> Void) = {} @IBOutlet weak var tableView: UITableView! @@ -121,7 +119,7 @@ class RecentContainersViewController : MoppModalViewController { let fileURL = URL(fileURLWithPath: fileName) let pathExtension = fileURL.pathExtension if !pathExtension.isEmpty { - return pathExtension.isAsicContainerExtension || pathExtension.isCdocContainerExtension || pathExtension.isPdfContainerExtension + return pathExtension.isAsicContainerExtension || pathExtension.isCryptoContainerExtension || pathExtension.isPdfContainerExtension } return false @@ -225,33 +223,17 @@ extension RecentContainersViewController : UITableViewDelegate { self.openContainer(containerPath: path.path, navController: navController, isSendingToSivaAgreed: true) } } else { - var containerViewController: ContainerViewController LandingViewController.shared.containerType = .cdoc - containerViewController = CryptoContainerViewController.instantiate() - containerViewController.containerPath = path.path - - let container = CryptoContainer(filename: path.lastPathComponent as NSString, filePath: path.path as NSString) - - MoppLibCryptoActions.sharedInstance().parseCdocInfo( - path.path as String?, - success: {(_ cdocInfo: CdocInfo?) -> Void in - guard let strongCdocInfo = cdocInfo else { return } - let cryptoContainer = (containerViewController as! CryptoContainerViewController) - container.addressees = strongCdocInfo.addressees as? [Addressee] ?? [] - container.dataFiles = strongCdocInfo.dataFiles - cryptoContainer.containerPath = path.path as String? - cryptoContainer.state = .opened - - cryptoContainer.container = container - cryptoContainer.isContainerEncrypted = true - - navController = (LandingViewController.shared.viewController(for: .cryptoTab) as? UINavigationController)! - navController.pushViewController(cryptoContainer, animated: true) - }, - failure: { _ in - failure() - } - ) + Decrypt.parseCdocInfo(withFullPath: path.path) { cdocInfo in + guard let strongCdocInfo = cdocInfo else { return failure() } + let cryptoContainer = CryptoContainerViewController.instantiate() + cryptoContainer.containerPath = path.path + cryptoContainer.container = CryptoContainer(filename: path.lastPathComponent, filePath: path.path, cdocInfo: strongCdocInfo) + cryptoContainer.state = .opened + cryptoContainer.isContainerEncrypted = true + navController = (LandingViewController.shared.viewController(for: .cryptoTab) as? UINavigationController)! + navController.pushViewController(cryptoContainer, animated: true) + } } }) diff --git a/MoppApp/MoppApp/SettingsConfiguration.swift b/MoppApp/MoppApp/SettingsConfiguration.swift index 216ed9053..912547b63 100644 --- a/MoppApp/MoppApp/SettingsConfiguration.swift +++ b/MoppApp/MoppApp/SettingsConfiguration.swift @@ -354,7 +354,7 @@ class SettingsConfiguration: NSObject, URLSessionDelegate, URLSessionTaskDelegat }, andFailure: { error in printLog("Failed to reload DigiDocConf") fatalError("Failed to reload DigiDocConf") - }, andTSUrl: DefaultsHelper.timestampUrl ?? MoppConfiguration.getMoppLibConfiguration().tsaurl, + }, andTSUrl: DefaultsHelper.timestampUrl ?? MoppConfiguration.getMoppLibConfiguration().tsaURL, withMoppConfiguration: MoppConfiguration.getMoppLibConfiguration(), andProxyConfiguration: ManualProxy.getMoppLibProxyConfiguration()) } diff --git a/MoppApp/MoppApp/SignatureUtil.swift b/MoppApp/MoppApp/SignatureUtil.swift index 5587cdf82..aeff1c22f 100644 --- a/MoppApp/MoppApp/SignatureUtil.swift +++ b/MoppApp/MoppApp/SignatureUtil.swift @@ -26,22 +26,15 @@ import MoppLib class SignatureUtil { - static func isCades(signatures: [Any]) -> Bool { - for signature in signatures { - guard let sig = signature as? MoppLibSignature else { return false } - - return sig.signatureFormat.lowercased().contains("cades") + static func isCades(signatures: [MoppLibSignature]) -> Bool { + signatures.contains { signature in + return signature.signatureFormat.lowercased().contains("cades") } - - return false } - static func isXades(signatures: [Any]) -> Bool { + static func isXades(signatures: [MoppLibSignature]) -> Bool { return signatures.contains { signature in - if let sig = signature as? MoppLibSignature { - return sig.signatureFormat.lowercased().contains("bes") - } - return false + return signature.signatureFormat.lowercased().contains("bes") } } diff --git a/MoppApp/MoppApp/Signing/SigningCategoryViewController.swift b/MoppApp/MoppApp/Signing/SigningCategoryViewController.swift index 74a69be06..10fe614f3 100644 --- a/MoppApp/MoppApp/Signing/SigningCategoryViewController.swift +++ b/MoppApp/MoppApp/Signing/SigningCategoryViewController.swift @@ -351,10 +351,10 @@ extension SigningCategoryViewController: SettingsTimeStampCellDelegate { MoppLibContainerActions.setup(success: { printLog("success") }, andFailure: { [weak self] error in - let nsError = error as? NSError + let nsError = error as NSError self?.errorAlertWithLink(message: MessageUtil.generateDetailedErrorMessage(error: nsError) ?? L(.genericErrorMessage)) - }, andTSUrl: DefaultsHelper.timestampUrl ?? MoppConfiguration.getMoppLibConfiguration().tsaurl, + }, andTSUrl: DefaultsHelper.timestampUrl ?? MoppConfiguration.getMoppLibConfiguration().tsaURL, withMoppConfiguration: MoppConfiguration.getMoppLibConfiguration(), andProxyConfiguration: ManualProxy.getMoppLibProxyConfiguration()) } diff --git a/MoppApp/MoppApp/SigningActions.swift b/MoppApp/MoppApp/SigningActions.swift index 08eaf723c..ac2e7f4fc 100644 --- a/MoppApp/MoppApp/SigningActions.swift +++ b/MoppApp/MoppApp/SigningActions.swift @@ -35,9 +35,7 @@ protocol SigningActions { extension SigningActions where Self: SigningContainerViewController { func removeContainerSignature(signatureIndex: Int) { - guard let signature = container.signatures[signatureIndex] as? MoppLibSignature else { - return - } + let signature = container.signatures[signatureIndex] confirmDeleteAlert( message: L(.signatureRemoveConfirmMessage), confirmCallback: { [weak self] (alertAction) in @@ -116,11 +114,11 @@ extension SigningActions where Self: SigningContainerViewController { } func sortSignatures() { - container.signatures.sort { (sig1: Any, sig2: Any) -> Bool in - let signatureStatusValue1 = (sig1 as! MoppLibSignature).status.rawValue - let signatureStatusValue2 = (sig2 as! MoppLibSignature).status.rawValue + container.signatures.sort { (sig1: MoppLibSignature, sig2: MoppLibSignature) -> Bool in + let signatureStatusValue1 = sig1.status.rawValue + let signatureStatusValue2 = sig2.status.rawValue if signatureStatusValue1 == signatureStatusValue2 { - return (sig1 as! MoppLibSignature).timestamp < (sig2 as! MoppLibSignature).timestamp + return sig1.timestamp < sig2.timestamp } return signatureStatusValue1 > signatureStatusValue2 diff --git a/MoppApp/MoppApp/SigningContainerViewController.swift b/MoppApp/MoppApp/SigningContainerViewController.swift index 2f5766ac2..38836b0d7 100644 --- a/MoppApp/MoppApp/SigningContainerViewController.swift +++ b/MoppApp/MoppApp/SigningContainerViewController.swift @@ -31,12 +31,12 @@ class SigningContainerViewController : ContainerViewController, SigningActions { var notificationMessages: [NotificationMessage] = [] var invalidSignaturesCount: Int { if container == nil { return 0 } - return (container.signatures as! [MoppLibSignature]).filter { (MoppLibSignatureStatus.Invalid == $0.status) }.count + return container.signatures.filter { (MoppLibSignatureStatus.Invalid == $0.status) }.count } var unknownSignaturesCount: Int { if container == nil { return 0 } - return (container.signatures as! [MoppLibSignature]).filter { (MoppLibSignatureStatus.UnknownStatus == $0.status) }.count + return container.signatures.filter { (MoppLibSignatureStatus.UnknownStatus == $0.status) }.count } override class func instantiate() -> SigningContainerViewController { @@ -97,11 +97,11 @@ extension SigningContainerViewController : SigningContainerViewControllerDelegat removeContainerSignature(signatureIndex: index) } - func getSignature(index: Int) -> Any { + func getSignature(index: Int) -> MoppLibSignature? { return container.signatures[index] } - func getTimestampToken(index: Int) -> Any { + func getTimestampToken(index: Int) -> MoppLibSignature? { return container.timestampTokens[index] } @@ -219,10 +219,7 @@ extension SigningContainerViewController : ContainerViewControllerDelegate { } func getDataFileDisplayName(index: Int) -> String? { - guard let dataFile = container.dataFiles[index] as? MoppLibDataFile else { - return nil - } - return (dataFile.fileName as String) + return container.dataFiles[index].fileName } func getContainer() -> MoppLibContainer { @@ -234,7 +231,7 @@ extension SigningContainerViewController : ContainerViewControllerDelegate { } func getDataFileRelativePath(index: Int) -> String { - return (container.dataFiles as! [MoppLibDataFile])[index].fileName + return container.dataFiles[index].fileName } func getDataFileCount() -> Int { @@ -257,12 +254,9 @@ extension SigningContainerViewController : ContainerViewControllerDelegate { let isPDF = containerPath.filenameComponents().ext.lowercased() == ContainerFormatPDF forcePDFContentPreview = isPDF MoppLibContainerActions.sharedInstance().openContainer(withPath: containerPath, success: { [weak self] container in - guard let container = container else { - return - } guard let strongSelf = self else { return } - + strongSelf.notificationMessages = [] if afterSignatureCreated && container.isSignable() && !strongSelf.isForPreview { @@ -304,7 +298,7 @@ extension SigningContainerViewController : ContainerViewControllerDelegate { }, failure: { [weak self] error in - let nserror = error! as NSError + let nserror = error as NSError var message = nserror.domain switch nserror.code { case MoppLibErrorCode.moppLibErrorGeneral.rawValue: diff --git a/MoppLib/MoppLib.xcodeproj/project.pbxproj b/MoppLib/MoppLib.xcodeproj/project.pbxproj index 5a3423333..85c8d3407 100644 --- a/MoppLib/MoppLib.xcodeproj/project.pbxproj +++ b/MoppLib/MoppLib.xcodeproj/project.pbxproj @@ -8,13 +8,14 @@ /* Begin PBXBuildFile section */ 39266A5320CFC0F4002E3F23 /* SmartToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39266A5220CFC0F4002E3F23 /* SmartToken.swift */; }; - 399C01E320BC11C20056D7AC /* MoppLibCryptoActions.m in Sources */ = {isa = PBXBuildFile; fileRef = 399C01E220BC11C20056D7AC /* MoppLibCryptoActions.m */; }; - 399C01E620BC17A10056D7AC /* MoppLibCryptoActions.h in Headers */ = {isa = PBXBuildFile; fileRef = 399C01E120BC0EF30056D7AC /* MoppLibCryptoActions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 39DFDA6320C81F5D00D0D134 /* CryptoLib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 399C01E420BC13320056D7AC /* CryptoLib.framework */; }; 4E0053842D7DEE8B00B1AFE5 /* CardCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5463DA4A1E12927A008A1714 /* CardCommands.swift */; }; + 4E0543E22D422FA40042CE10 /* MoppLibDigidocValidateOnline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E0543E12D422F8F0042CE10 /* MoppLibDigidocValidateOnline.swift */; }; + 4E0543F32D4278100042CE10 /* MoppLibDataFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E0543F22D4278080042CE10 /* MoppLibDataFile.swift */; }; 4E63A77B2AEA7C5A00CEE392 /* digidocpp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E63A77A2AEA7C5A00CEE392 /* digidocpp.framework */; }; 4E7C7A082D76F0E800D7343C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E7C7A072D76F0E800D7343C /* UIKit.framework */; }; 4ECAD7B42D7DAFA800B02E0F /* CardReaderWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DC0DC31E0BCC2A00C62B3D /* CardReaderWrapper.swift */; }; + 4ED11A8A2D817BAA0083AB72 /* MoppLibCryptoActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ED11A892D817BAA0083AB72 /* MoppLibCryptoActions.swift */; }; 542DCB6D1E23968000899534 /* MoppLibPinActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 542DCB6B1E23968000899534 /* MoppLibPinActions.swift */; }; 545111731E13BBA800296B80 /* MoppLibPersonalData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 545111711E13BBA800296B80 /* MoppLibPersonalData.swift */; }; 546E57611E2E07C7009A568D /* PinVerificationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 546E57601E2E07C7009A568D /* PinVerificationTests.m */; }; @@ -38,19 +39,12 @@ C5E41C5E2180602B00D79B54 /* Idemia.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5E41C5C2180602B00D79B54 /* Idemia.swift */; }; C5F462A8209727E8001B7D59 /* CoreBluetooth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5F462A7209727E8001B7D59 /* CoreBluetooth.framework */; }; DF1503872AC5CE32007222B2 /* OCMock in Frameworks */ = {isa = PBXBuildFile; productRef = DF1503862AC5CE32007222B2 /* OCMock */; }; - DFBDF1F827DA44BD00A5CF3C /* MoppLibRoleAddressData.h in Headers */ = {isa = PBXBuildFile; fileRef = DFBDF1F727DA44BD00A5CF3C /* MoppLibRoleAddressData.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DFBDF1FA27DA44FD00A5CF3C /* MoppLibRoleAddressData.m in Sources */ = {isa = PBXBuildFile; fileRef = DFBDF1F927DA44FD00A5CF3C /* MoppLibRoleAddressData.m */; }; - DFDD76292B507EFF0008EC2C /* MoppLibProxyConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = DFDD76282B507EFF0008EC2C /* MoppLibProxyConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DFDD762B2B507F9E0008EC2C /* MoppLibProxyConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = DFDD762A2B507F9E0008EC2C /* MoppLibProxyConfiguration.m */; }; - DFF3C3A923322E0D0079458A /* MoppLibConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = DFF3C3A723322E0C0079458A /* MoppLibConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DFF3C3AA23322E0D0079458A /* MoppLibConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = DFF3C3A823322E0C0079458A /* MoppLibConfiguration.m */; }; + DFBDF1FA27DA44FD00A5CF3C /* MoppLibRoleAddressData.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFBDF1F927DA44FD00A5CF3C /* MoppLibRoleAddressData.swift */; }; + DFDD762B2B507F9E0008EC2C /* MoppLibProxyConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFDD762A2B507F9E0008EC2C /* MoppLibProxyConfiguration.swift */; }; + DFF3C3AA23322E0D0079458A /* MoppLibConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFF3C3A823322E0C0079458A /* MoppLibConfiguration.swift */; }; E4250CEC1E09695100530370 /* MoppLib.h in Headers */ = {isa = PBXBuildFile; fileRef = E4250CEA1E09695100530370 /* MoppLib.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E42B08B51E1F0B3B00EA24A3 /* MoppLibContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = E42B08B31E1F0B3B00EA24A3 /* MoppLibContainer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E42B08B61E1F0B3B00EA24A3 /* MoppLibContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = E42B08B41E1F0B3B00EA24A3 /* MoppLibContainer.m */; }; - E42B08C51E1F11B900EA24A3 /* MoppLibDataFile.h in Headers */ = {isa = PBXBuildFile; fileRef = E42B08C31E1F11B900EA24A3 /* MoppLibDataFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E42B08C61E1F11B900EA24A3 /* MoppLibDataFile.m in Sources */ = {isa = PBXBuildFile; fileRef = E42B08C41E1F11B900EA24A3 /* MoppLibDataFile.m */; }; - E42B08C91E1F11C100EA24A3 /* MoppLibSignature.h in Headers */ = {isa = PBXBuildFile; fileRef = E42B08C71E1F11C100EA24A3 /* MoppLibSignature.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E42B08CA1E1F11C100EA24A3 /* MoppLibSignature.m in Sources */ = {isa = PBXBuildFile; fileRef = E42B08C81E1F11C100EA24A3 /* MoppLibSignature.m */; }; + E42B08B61E1F0B3B00EA24A3 /* MoppLibContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E42B08B41E1F0B3B00EA24A3 /* MoppLibContainer.swift */; }; + E42B08CA1E1F11C100EA24A3 /* MoppLibSignature.swift in Sources */ = {isa = PBXBuildFile; fileRef = E42B08C81E1F11C100EA24A3 /* MoppLibSignature.swift */; }; E42B08CD1E1F136A00EA24A3 /* MoppLibDigidocManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E42B08CB1E1F136A00EA24A3 /* MoppLibDigidocManager.h */; }; E42B08CE1E1F136A00EA24A3 /* MoppLibDigidocManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = E42B08CC1E1F136A00EA24A3 /* MoppLibDigidocManager.mm */; }; E485A7831E2DF58200C53DBF /* MLFileManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E485A7811E2DF58200C53DBF /* MLFileManager.h */; }; @@ -69,12 +63,13 @@ /* Begin PBXFileReference section */ 39266A5220CFC0F4002E3F23 /* SmartToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartToken.swift; sourceTree = ""; }; - 399C01E120BC0EF30056D7AC /* MoppLibCryptoActions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MoppLibCryptoActions.h; sourceTree = ""; }; - 399C01E220BC11C20056D7AC /* MoppLibCryptoActions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MoppLibCryptoActions.m; sourceTree = ""; }; 399C01E420BC13320056D7AC /* CryptoLib.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CryptoLib.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4E0543E12D422F8F0042CE10 /* MoppLibDigidocValidateOnline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoppLibDigidocValidateOnline.swift; sourceTree = ""; }; + 4E0543F22D4278080042CE10 /* MoppLibDataFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoppLibDataFile.swift; sourceTree = ""; }; 4E63A77A2AEA7C5A00CEE392 /* digidocpp.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = digidocpp.framework; path = "$(DIGIDOCPP_PATH)/lib/digidocpp.framework"; sourceTree = ""; }; 4E7C7A072D76F0E800D7343C /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 4ECAD7B12D7DAD0500B02E0F /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; + 4ED11A892D817BAA0083AB72 /* MoppLibCryptoActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoppLibCryptoActions.swift; sourceTree = ""; }; 542DCB6B1E23968000899534 /* MoppLibPinActions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoppLibPinActions.swift; sourceTree = ""; }; 545111711E13BBA800296B80 /* MoppLibPersonalData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoppLibPersonalData.swift; sourceTree = ""; }; 5463DA4A1E12927A008A1714 /* CardCommands.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardCommands.swift; sourceTree = ""; }; @@ -104,20 +99,13 @@ C5AAAF8920CAA4790087D6DA /* ft301u.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ft301u.h; sourceTree = ""; }; C5E41C5C2180602B00D79B54 /* Idemia.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Idemia.swift; sourceTree = ""; }; C5F462A7209727E8001B7D59 /* CoreBluetooth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreBluetooth.framework; path = System/Library/Frameworks/CoreBluetooth.framework; sourceTree = SDKROOT; }; - DFBDF1F727DA44BD00A5CF3C /* MoppLibRoleAddressData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MoppLibRoleAddressData.h; sourceTree = ""; }; - DFBDF1F927DA44FD00A5CF3C /* MoppLibRoleAddressData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MoppLibRoleAddressData.m; sourceTree = ""; }; - DFDD76282B507EFF0008EC2C /* MoppLibProxyConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MoppLibProxyConfiguration.h; sourceTree = ""; }; - DFDD762A2B507F9E0008EC2C /* MoppLibProxyConfiguration.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MoppLibProxyConfiguration.m; sourceTree = ""; }; - DFF3C3A723322E0C0079458A /* MoppLibConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MoppLibConfiguration.h; sourceTree = ""; }; - DFF3C3A823322E0C0079458A /* MoppLibConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MoppLibConfiguration.m; sourceTree = ""; }; + DFBDF1F927DA44FD00A5CF3C /* MoppLibRoleAddressData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoppLibRoleAddressData.swift; sourceTree = ""; }; + DFDD762A2B507F9E0008EC2C /* MoppLibProxyConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoppLibProxyConfiguration.swift; sourceTree = ""; }; + DFF3C3A823322E0C0079458A /* MoppLibConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoppLibConfiguration.swift; sourceTree = ""; }; E4250CE71E09695100530370 /* MoppLib.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MoppLib.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E4250CEA1E09695100530370 /* MoppLib.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MoppLib.h; sourceTree = ""; }; - E42B08B31E1F0B3B00EA24A3 /* MoppLibContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MoppLibContainer.h; sourceTree = ""; }; - E42B08B41E1F0B3B00EA24A3 /* MoppLibContainer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MoppLibContainer.m; sourceTree = ""; }; - E42B08C31E1F11B900EA24A3 /* MoppLibDataFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MoppLibDataFile.h; sourceTree = ""; }; - E42B08C41E1F11B900EA24A3 /* MoppLibDataFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MoppLibDataFile.m; sourceTree = ""; }; - E42B08C71E1F11C100EA24A3 /* MoppLibSignature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MoppLibSignature.h; sourceTree = ""; }; - E42B08C81E1F11C100EA24A3 /* MoppLibSignature.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MoppLibSignature.m; sourceTree = ""; }; + E42B08B41E1F0B3B00EA24A3 /* MoppLibContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoppLibContainer.swift; sourceTree = ""; }; + E42B08C81E1F11C100EA24A3 /* MoppLibSignature.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoppLibSignature.swift; sourceTree = ""; }; E42B08CB1E1F136A00EA24A3 /* MoppLibDigidocManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MoppLibDigidocManager.h; sourceTree = ""; }; E42B08CC1E1F136A00EA24A3 /* MoppLibDigidocManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MoppLibDigidocManager.mm; sourceTree = ""; }; E485A7811E2DF58200C53DBF /* MLFileManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MLFileManager.h; sourceTree = ""; }; @@ -171,13 +159,11 @@ C54EA737204D91730039AC78 /* MoppLibCardReaderManager.swift */, 54D164751E9269C50069C725 /* MoppLibContainerActions.h */, 54D164761E9269C50069C725 /* MoppLibContainerActions.mm */, - 399C01E120BC0EF30056D7AC /* MoppLibCryptoActions.h */, - 399C01E220BC11C20056D7AC /* MoppLibCryptoActions.m */, - 542DCB6B1E23968000899534 /* MoppLibPinActions.swift */, + 4ED11A892D817BAA0083AB72 /* MoppLibCryptoActions.swift */, 54DC0DC71E0BCCEF00C62B3D /* MoppLibConstants.h */, 54DC0E001E0D48C900C62B3D /* MoppLibError.swift */, - DFDD76282B507EFF0008EC2C /* MoppLibProxyConfiguration.h */, - DFDD762A2B507F9E0008EC2C /* MoppLibProxyConfiguration.m */, + 542DCB6B1E23968000899534 /* MoppLibPinActions.swift */, + DFDD762A2B507F9E0008EC2C /* MoppLibProxyConfiguration.swift */, ); name = PublicInterface; path = MoppLib/PublicInterface; @@ -187,16 +173,11 @@ isa = PBXGroup; children = ( 545111711E13BBA800296B80 /* MoppLibPersonalData.swift */, - E42B08B31E1F0B3B00EA24A3 /* MoppLibContainer.h */, - E42B08B41E1F0B3B00EA24A3 /* MoppLibContainer.m */, - E42B08C31E1F11B900EA24A3 /* MoppLibDataFile.h */, - E42B08C41E1F11B900EA24A3 /* MoppLibDataFile.m */, - E42B08C71E1F11C100EA24A3 /* MoppLibSignature.h */, - E42B08C81E1F11C100EA24A3 /* MoppLibSignature.m */, - DFF3C3A723322E0C0079458A /* MoppLibConfiguration.h */, - DFF3C3A823322E0C0079458A /* MoppLibConfiguration.m */, - DFBDF1F727DA44BD00A5CF3C /* MoppLibRoleAddressData.h */, - DFBDF1F927DA44FD00A5CF3C /* MoppLibRoleAddressData.m */, + E42B08B41E1F0B3B00EA24A3 /* MoppLibContainer.swift */, + 4E0543F22D4278080042CE10 /* MoppLibDataFile.swift */, + E42B08C81E1F11C100EA24A3 /* MoppLibSignature.swift */, + DFF3C3A823322E0C0079458A /* MoppLibConfiguration.swift */, + DFBDF1F927DA44FD00A5CF3C /* MoppLibRoleAddressData.swift */, ); name = ResponseObjects; sourceTree = ""; @@ -296,20 +277,13 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - DFDD76292B507EFF0008EC2C /* MoppLibProxyConfiguration.h in Headers */, - DFBDF1F827DA44BD00A5CF3C /* MoppLibRoleAddressData.h in Headers */, C5AAAF8620CAA3F00087D6DA /* winscard.h in Headers */, C5AAAF8820CAA4240087D6DA /* wintypes.h in Headers */, E485A7831E2DF58200C53DBF /* MLFileManager.h in Headers */, C5AAAF8A20CAA4790087D6DA /* ft301u.h in Headers */, - DFF3C3A923322E0D0079458A /* MoppLibConfiguration.h in Headers */, - E42B08C51E1F11B900EA24A3 /* MoppLibDataFile.h in Headers */, - 399C01E620BC17A10056D7AC /* MoppLibCryptoActions.h in Headers */, E42B08CD1E1F136A00EA24A3 /* MoppLibDigidocManager.h in Headers */, 54DC0DC91E0BCCEF00C62B3D /* MoppLibConstants.h in Headers */, 54D164771E9269C50069C725 /* MoppLibContainerActions.h in Headers */, - E42B08B51E1F0B3B00EA24A3 /* MoppLibContainer.h in Headers */, - E42B08C91E1F11C100EA24A3 /* MoppLibSignature.h in Headers */, E4250CEC1E09695100530370 /* MoppLib.h in Headers */, C5AAAF8420CAA3D00087D6DA /* ReaderInterface.h in Headers */, ); @@ -374,7 +348,7 @@ }; E4250CE61E09695100530370 = { CreatedOnToolsVersion = 8.0; - LastSwiftMigration = 0820; + LastSwiftMigration = 1620; }; }; }; @@ -436,25 +410,25 @@ files = ( 4E0053842D7DEE8B00B1AFE5 /* CardCommands.swift in Sources */, 4ECAD7B42D7DAFA800B02E0F /* CardReaderWrapper.swift in Sources */, - DFBDF1FA27DA44FD00A5CF3C /* MoppLibRoleAddressData.m in Sources */, 54E1DB5D1E44A9060060A250 /* MoppLibManager.swift in Sources */, + DFBDF1FA27DA44FD00A5CF3C /* MoppLibRoleAddressData.swift in Sources */, E42B08CE1E1F136A00EA24A3 /* MoppLibDigidocManager.mm in Sources */, E485A7841E2DF58200C53DBF /* MLFileManager.m in Sources */, - E42B08B61E1F0B3B00EA24A3 /* MoppLibContainer.m in Sources */, 54D1647C1E926AAB0069C725 /* MoppLibCardActions.swift in Sources */, - E42B08CA1E1F11C100EA24A3 /* MoppLibSignature.m in Sources */, - DFDD762B2B507F9E0008EC2C /* MoppLibProxyConfiguration.m in Sources */, - 399C01E320BC11C20056D7AC /* MoppLibCryptoActions.m in Sources */, + E42B08B61E1F0B3B00EA24A3 /* MoppLibContainer.swift in Sources */, + E42B08CA1E1F11C100EA24A3 /* MoppLibSignature.swift in Sources */, + DFDD762B2B507F9E0008EC2C /* MoppLibProxyConfiguration.swift in Sources */, C5E41C5E2180602B00D79B54 /* Idemia.swift in Sources */, 39266A5320CFC0F4002E3F23 /* SmartToken.swift in Sources */, 542DCB6D1E23968000899534 /* MoppLibPinActions.swift in Sources */, C54EA732204D5E860039AC78 /* CardReaderiR301.swift in Sources */, 545111731E13BBA800296B80 /* MoppLibPersonalData.swift in Sources */, - DFF3C3AA23322E0D0079458A /* MoppLibConfiguration.m in Sources */, 54DC0E021E0D48C900C62B3D /* MoppLibError.swift in Sources */, - E42B08C61E1F11B900EA24A3 /* MoppLibDataFile.m in Sources */, C54EA738204D91730039AC78 /* MoppLibCardReaderManager.swift in Sources */, 54D164781E9269C50069C725 /* MoppLibContainerActions.mm in Sources */, + 4E0543F32D4278100042CE10 /* MoppLibDataFile.swift in Sources */, + DFF3C3AA23322E0D0079458A /* MoppLibConfiguration.swift in Sources */, + 4ED11A8A2D817BAA0083AB72 /* MoppLibCryptoActions.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -535,6 +509,7 @@ E4250CED1E09695100530370 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; @@ -589,9 +564,11 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -599,6 +576,7 @@ E4250CEE1E09695100530370 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; @@ -646,8 +624,10 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; }; diff --git a/MoppLib/MoppLib/MLFileManager.h b/MoppLib/MoppLib/MLFileManager.h index 60aef4c30..6b59a3dcb 100644 --- a/MoppLib/MoppLib/MLFileManager.h +++ b/MoppLib/MoppLib/MLFileManager.h @@ -25,14 +25,14 @@ @interface MLFileManager : NSObject -+ (MLFileManager *)sharedInstance; ++ (MLFileManager * _Nonnull)sharedInstance; -- (NSString *)tslCachePath; -- (NSArray *)getContainers; -- (BOOL)fileExistsAtPath:(NSString *)filePath; -- (NSString *)cacheDirectoryPath; -- (NSString *)logsDirectoryPath; -- (BOOL)createFolder:(NSString *)folderName; -- (BOOL)folderExists:(NSString *)folderPath; +- (NSString * _Nonnull)tslCachePath; +- (NSArray * _Nonnull)getContainers; +- (BOOL)fileExistsAtPath:(NSString * _Nonnull)filePath; +- (NSString * _Nonnull)cacheDirectoryPath; +- (NSString * _Nonnull)logsDirectoryPath; +- (BOOL)createFolder:(NSString * _Nonnull)folderName; +- (BOOL)folderExists:(NSString *_Nonnull)folderPath; @end diff --git a/MoppLib/MoppLib/MLFileManager.m b/MoppLib/MoppLib/MLFileManager.m index f82fb2652..4ae0925e4 100644 --- a/MoppLib/MoppLib/MLFileManager.m +++ b/MoppLib/MoppLib/MLFileManager.m @@ -69,7 +69,7 @@ - (NSString *)filePathWithFileName:(NSString *)fileName { return filePath; } -- (NSArray *)getContainers { +- (NSArray *)getContainers { NSArray *supportedExtensions = @[@"bdoc", @"asice"]; NSArray *allFiles = [self.fileManager contentsOfDirectoryAtPath:[self cacheDirectoryPath] error:nil]; diff --git a/MoppLib/MoppLib/MoppLibDigidocManager.h b/MoppLib/MoppLib/MoppLibDigidocManager.h index 66cae2dfd..d2365a07a 100644 --- a/MoppLib/MoppLib/MoppLibDigidocManager.h +++ b/MoppLib/MoppLib/MoppLibDigidocManager.h @@ -37,7 +37,7 @@ - (MoppLibContainer *)createContainerWithPath:(NSString *)containerPath withDataFilePaths:(NSArray *)dataFilePaths error:(NSError **)error; - (MoppLibContainer *)addDataFilesToContainerWithPath:(NSString *)containerPath withDataFilePaths:(NSArray *)dataFilePaths error:(NSError **)error; - (MoppLibContainer *)removeDataFileFromContainerWithPath:(NSString *)containerPath atIndex:(NSUInteger)dataFileIndex error:(NSError **)error; -- (NSArray *)getContainers; +- (NSArray *)getContainers; + (NSData *)prepareSignature:(NSData *)cert containerPath:(NSString *)containerPath roleData:(MoppLibRoleAddressData *)roleData; + (void)isSignatureValid:(NSData *)cert signatureValue:(NSData *)signatureValue success:(VoidBlock)success failure:(FailureBlock)failure; - (void)addSignature:(NSString *)containerPath pin2:(NSString *)pin2 cert:(NSData *)cert roleData:(MoppLibRoleAddressData *)roleData success:(ContainerBlock)success andFailure:(FailureBlock)failure; diff --git a/MoppLib/MoppLib/MoppLibDigidocManager.mm b/MoppLib/MoppLib/MoppLibDigidocManager.mm index f392e0712..d0bbe5c9d 100644 --- a/MoppLib/MoppLib/MoppLibDigidocManager.mm +++ b/MoppLib/MoppLib/MoppLibDigidocManager.mm @@ -22,12 +22,6 @@ */ #import "MoppLibDigidocManager.h" -#import "MoppLibConfiguration.h" -#import "MoppLibContainer.h" -#import "MoppLibDataFile.h" -#import "MoppLibProxyConfiguration.h" -#import "MoppLibRoleAddressData.h" -#import "MoppLibSignature.h" #import "MLFileManager.h" #import #import @@ -40,6 +34,11 @@ #include #include +@implementation NSString (Digidoc) ++ (NSString*)stdstring:(const std::string&)str { + return str.empty() ? [NSString string] : @(str.c_str()); +} +@end class DigiDocConf: public digidoc::ConfCurrent { @@ -50,7 +49,8 @@ public: - DigiDocConf(const std::string& tsUrl, MoppLibConfiguration* moppConfiguration, MoppLibProxyConfiguration* proxyConfiguration) : m_tsUrl( tsUrl ), moppLibConfiguration( moppConfiguration ), proxyConfiguration( proxyConfiguration ) {} + DigiDocConf(const std::string& tsUrl, MoppLibConfiguration* moppConfiguration, MoppLibProxyConfiguration* proxyConfiguration) + : m_tsUrl( tsUrl ), moppLibConfiguration( moppConfiguration ), proxyConfiguration( proxyConfiguration ) {} std::string TSLCache() const override { NSString *tslCachePath = [[MLFileManager sharedInstance] tslCachePath]; @@ -61,36 +61,36 @@ std::string TSUrl() const override { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *tsaUrl = [defaults stringForKey:@"kTimestampUrlKey"]; - return [tsaUrl length] != 0 ? tsaUrl.UTF8String : moppLibConfiguration.TSAURL.UTF8String; + return [tsaUrl length] != 0 ? tsaUrl.UTF8String : moppLibConfiguration.tsaURL.UTF8String; } std::string verifyServiceUri() const override { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *sivaUrl = [defaults stringForKey:@"kSivaUrl"]; - NSString *usingSivaUrl = [sivaUrl length] != 0 ? sivaUrl : moppLibConfiguration.SIVAURL; + NSString *usingSivaUrl = [sivaUrl length] != 0 ? sivaUrl : moppLibConfiguration.sivaURL; printLog(@"Using SiVa URL: %@", usingSivaUrl); NSLog(@"Using SiVa URL: %@", usingSivaUrl); - return [sivaUrl length] != 0 ? sivaUrl.UTF8String : moppLibConfiguration.SIVAURL.UTF8String; + return [sivaUrl length] != 0 ? sivaUrl.UTF8String : moppLibConfiguration.sivaURL.UTF8String; } std::vector TSLCerts() const override { - return stringsToX509Certs(moppLibConfiguration.TSLCERTS); + return stringsToX509Certs(moppLibConfiguration.tslCerts); } std::string TSLUrl() const override { - return moppLibConfiguration.TSLURL.UTF8String; + return moppLibConfiguration.tslURL.UTF8String; } std::vector TSCerts() const override { - NSMutableArray *certBundle = [NSMutableArray arrayWithArray:moppLibConfiguration.CERTBUNDLE]; - if (moppLibConfiguration.TSACERT != NULL) { - [certBundle addObject:moppLibConfiguration.TSACERT]; + NSMutableArray *certBundle = [NSMutableArray arrayWithArray:moppLibConfiguration.certBundle]; + if (moppLibConfiguration.tsaCert != NULL) { + [certBundle addObject:moppLibConfiguration.tsaCert]; } return stringsToX509Certs(certBundle); } virtual std::vector verifyServiceCerts() const override { - NSMutableArray *certs = [NSMutableArray arrayWithArray:moppLibConfiguration.CERTBUNDLE]; + NSMutableArray *certs = [NSMutableArray arrayWithArray:moppLibConfiguration.certBundle]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *sivaFileName = [defaults stringForKey:@"kSivaFileCertName"]; if (!(sivaFileName == nil || [sivaFileName isEqualToString:@""])) { @@ -112,10 +112,10 @@ } std::string ocsp(const std::string &issuer) const override { - NSString *ocspIssuer = [NSString stringWithCString:issuer.c_str() encoding:[NSString defaultCStringEncoding]]; - if ([moppLibConfiguration.OCSPISSUERS objectForKey:ocspIssuer]) { - printLog(@"Using issuer: '%@' with OCSP url from central configuration: %@", ocspIssuer, moppLibConfiguration.OCSPISSUERS[ocspIssuer]); - return std::string([moppLibConfiguration.OCSPISSUERS[ocspIssuer] UTF8String]); + NSString *ocspIssuer = [NSString stdstring:issuer]; + if ([moppLibConfiguration.ocspIssuers objectForKey:ocspIssuer]) { + printLog(@"Using issuer: '%@' with OCSP url from central configuration: %@", ocspIssuer, moppLibConfiguration.ocspIssuers[ocspIssuer]); + return std::string([moppLibConfiguration.ocspIssuers[ocspIssuer] UTF8String]); } printLog(@"Did not find url for issuer: %@.", ocspIssuer); return digidoc::ConfCurrent::ocsp(issuer); @@ -135,11 +135,11 @@ } virtual std::string proxyUser() const override { - return std::string([proxyConfiguration.USERNAME UTF8String]); + return std::string([proxyConfiguration.username UTF8String]); } virtual std::string proxyPass() const override { - return std::string([proxyConfiguration.PASSWORD UTF8String]); + return std::string([proxyConfiguration.password UTF8String]); } std::vector stringsToX509Certs(NSArray *certBundle) const { @@ -262,10 +262,6 @@ virtual bool validateOnline() const { }; -@interface MoppLibDigidocManager () - - (MoppLibSignatureStatus)determineSignatureStatus:(int) status; -@end - @implementation MoppLibDigidocManager static std::unique_ptr docContainer = nil; @@ -289,7 +285,7 @@ - (void)setupWithSuccess:(VoidBlock)success andFailure:(FailureBlock)failure and // Initialize libdigidocpp. try { std::string timestampUrl = tsUrl == nil ? - [moppConfiguration.TSAURL cStringUsingEncoding:NSUTF8StringEncoding] : + [moppConfiguration.tsaURL cStringUsingEncoding:NSUTF8StringEncoding] : [tsUrl cStringUsingEncoding:NSUTF8StringEncoding]; digidoc::Conf::init(new DigiDocConf(timestampUrl, moppConfiguration, proxyConfiguration)); std::string appInfo = MoppLibManager.userAgent.UTF8String; @@ -402,13 +398,13 @@ + (NSData *)prepareSignature:(NSData *)cert containerPath:(NSString *)containerP } NSLog(@"\nSetting profile info...\n"); - NSLog(@"Role data - roles: %@, city: %@, state: %@, zip: %@, country: %@", roleData.ROLES, roleData.CITY, roleData.STATE, roleData.ZIP, roleData.COUNTRY); + NSLog(@"Role data - roles: %@, city: %@, state: %@, zip: %@, country: %@", roleData.roles, roleData.city, roleData.state, roleData.zip, roleData.country); signer->setProfile("time-stamp"); - signer->setSignatureProductionPlace(std::string([roleData.CITY UTF8String] ?: ""), std::string([roleData.STATE UTF8String] ?: ""), std::string([roleData.ZIP UTF8String] ?: ""), std::string([roleData.COUNTRY UTF8String] ?: "")); + signer->setSignatureProductionPlace(std::string([roleData.city UTF8String] ?: ""), std::string([roleData.state UTF8String] ?: ""), std::string([roleData.zip UTF8String] ?: ""), std::string([roleData.country UTF8String] ?: "")); signer->setUserAgent(MoppLibManager.userAgent.UTF8String); std::vector roles; - for (NSString *role in roleData.ROLES) { + for (NSString *role in roleData.roles) { if (role != (id)[NSNull null] && [role length] != 0) { roles.push_back(std::string([role UTF8String] ?: "")); } @@ -425,16 +421,11 @@ + (NSData *)prepareSignature:(NSData *)cert containerPath:(NSString *)containerP return [NSData dataWithBytes:dataToSign.data() length:dataToSign.size()]; } -- (MoppLibContainer *)getContainerWithPath:(NSString *)containerPath error:(NSError **)error { +- (MoppLibContainer *)getContainerWithPath:(NSString * _Nonnull)containerPath error:(NSError **)error { // Having two container instances of the same file is causing crashes. Should synchronize all container operations? @synchronized (self) { - MoppLibContainer *moppLibContainer = [MoppLibContainer new]; - - [moppLibContainer setFileName:[containerPath lastPathComponent]]; - [moppLibContainer setFilePath:containerPath]; - std::unique_ptr doc; try { MoppLibDigidocContainerOpenCB cb(MoppLibManager.shared.validateOnline); @@ -460,14 +451,12 @@ - (MoppLibContainer *)getContainerWithPath:(NSString *)containerPath error:(NSEr NSMutableArray *dataFiles = [NSMutableArray array]; for (digidoc::DataFile *dataFile: doc->dataFiles()) { - MoppLibDataFile *moppLibDataFile = [MoppLibDataFile new]; - moppLibDataFile.fileId = [NSString stringWithUTF8String:dataFile->id().c_str()]; - moppLibDataFile.mediaType = [NSString stringWithUTF8String:dataFile->mediaType().c_str()]; - moppLibDataFile.fileName = [NSString stringWithUTF8String:dataFile->fileName().c_str()]; - moppLibDataFile.fileSize = dataFile->fileSize(); - [dataFiles addObject:moppLibDataFile]; + [dataFiles addObject:[[MoppLibDataFile alloc] + initWithFileName:[NSString stdstring:dataFile->fileName()] + mediaType:[NSString stdstring:dataFile->mediaType()] + fileId:[NSString stdstring:dataFile->id()] + fileSize:dataFile->fileSize()]]; } - moppLibContainer.dataFiles = dataFiles; // Signatures @@ -479,8 +468,12 @@ - (MoppLibContainer *)getContainerWithPath:(NSString *)containerPath error:(NSEr [timeStampTokens addObject:[self getSignatureData:signature->TimeStampCertificate() signature:signature mediaType:doc->mediaType() dataFileCount:doc->dataFiles().size()]]; } - moppLibContainer.signatures = [signatures copy]; - moppLibContainer.timestampTokens = [timeStampTokens copy]; + MoppLibContainer *moppLibContainer = [MoppLibContainer new]; + moppLibContainer.fileName = containerPath.lastPathComponent; + moppLibContainer.filePath = containerPath; + moppLibContainer.dataFiles = dataFiles; + moppLibContainer.signatures = signatures; + moppLibContainer.timestampTokens = timeStampTokens; return moppLibContainer; } catch(const digidoc::Exception &e) { @@ -537,21 +530,25 @@ - (MoppLibSignature *)getSignatureData:(const digidoc::X509Cert&)cert signature: [signatureRolesList addObject: [NSString stringWithUTF8String:signatureRole.c_str()]]; } - MoppLibRoleAddressData *moppLibRoleAddressData = [MoppLibRoleAddressData new]; - moppLibRoleAddressData.ROLES = signatureRolesList; - moppLibRoleAddressData.CITY = [NSString stringWithUTF8String:signature->city().c_str()]; - moppLibRoleAddressData.STATE = [NSString stringWithUTF8String:signature->stateOrProvince().c_str()]; - moppLibRoleAddressData.COUNTRY = [NSString stringWithUTF8String:signature->countryName().c_str()]; - moppLibRoleAddressData.ZIP = [NSString stringWithUTF8String:signature->postalCode().c_str()]; - moppLibSignature.roleAndAddressData = moppLibRoleAddressData; + moppLibSignature.roleAndAddressData = [[MoppLibRoleAddressData alloc] + initWithRoles:signatureRolesList + city:[NSString stdstring:signature->city()] + state:[NSString stdstring:signature->stateOrProvince()] + country:[NSString stdstring:signature->countryName()] + zip:[NSString stdstring:signature->postalCode()]]; try { digidoc::Signature::Validator validator(signature); - digidoc::Signature::Validator::Status status = validator.status(); - moppLibSignature.diagnosticsInfo = [NSString stringWithUTF8String:validator.diagnostics().c_str()]; - moppLibSignature.status = [self determineSignatureStatus:status]; + moppLibSignature.diagnosticsInfo = [NSString stdstring:validator.diagnostics()]; + switch (validator.status()) { + case digidoc::Signature::Validator::Status::Valid: moppLibSignature.status = MoppLibSignatureStatusValid; break; + case digidoc::Signature::Validator::Status::NonQSCD: moppLibSignature.status = MoppLibSignatureStatusNonQSCD; break; + case digidoc::Signature::Validator::Status::Warning: moppLibSignature.status = MoppLibSignatureStatusWarning; break; + case digidoc::Signature::Validator::Status::Unknown: moppLibSignature.status = MoppLibSignatureStatusUnknownStatus; break; + default: moppLibSignature.status = MoppLibSignatureStatusInvalid; break; + } } catch(const digidoc::Exception &e) { - moppLibSignature.status = Invalid; + moppLibSignature.status = MoppLibSignatureStatusInvalid; } return moppLibSignature; @@ -585,23 +582,6 @@ - (NSData *)getNSDataFromVector:(std::vector)vectorData { return [NSData dataWithBytes:vectorData.data() length:vectorData.size()]; } -- (MoppLibSignatureStatus)determineSignatureStatus:(int) status{ - - if(digidoc::Signature::Validator::Status::Valid==status){ - return Valid; - } - else if(digidoc::Signature::Validator::Status::NonQSCD==status){ - return NonQSCD; - } - else if(digidoc::Signature::Validator::Status::Warning==status){ - return Warning; - } - else if(digidoc::Signature::Validator::Status::Unknown==status){ - return UnknownStatus; - } - return Invalid; -} - - (MoppLibContainer *)createContainerWithPath:(NSString *)containerPath withDataFilePaths:(NSArray *)dataFilePaths error:(NSError **)error { MLLog(@"createContainerWithPath: %@, dataFilePaths: %@", containerPath, dataFilePaths); @@ -676,10 +656,10 @@ - (MoppLibContainer *)removeDataFileFromContainerWithPath:(NSString *)containerP return moppLibContainer; } -- (NSArray *)getContainers { +- (NSArray *)getContainers { NSMutableArray *containers = [NSMutableArray array]; - NSArray *containerPaths = [[MLFileManager sharedInstance] getContainers]; + NSArray *containerPaths = [[MLFileManager sharedInstance] getContainers]; for (NSString *containerPath in containerPaths) { NSError *error; MoppLibContainer *moppLibContainer = [self getContainerWithPath:containerPath error:&error]; @@ -705,13 +685,13 @@ - (void)addSignature:(NSString *)containerPath pin2:(NSString *)pin2 cert:(NSDat WebSigner signer([MoppLibDigidocManager getCertFromData:cert]); NSLog(@"\nSetting profile info...\n"); - NSLog(@"Role data - roles: %@, city: %@, state: %@, zip: %@, country: %@", roleData.ROLES, roleData.CITY, roleData.STATE, roleData.ZIP, roleData.COUNTRY); + NSLog(@"Role data - roles: %@, city: %@, state: %@, zip: %@, country: %@", roleData.roles, roleData.city, roleData.state, roleData.zip, roleData.country); signer.setProfile("time-stamp"); - signer.setSignatureProductionPlace(std::string([roleData.CITY UTF8String] ?: ""), std::string([roleData.STATE UTF8String] ?: ""), std::string([roleData.ZIP UTF8String] ?: ""), std::string([roleData.COUNTRY UTF8String] ?: "")); + signer.setSignatureProductionPlace(std::string([roleData.city UTF8String] ?: ""), std::string([roleData.state UTF8String] ?: ""), std::string([roleData.zip UTF8String] ?: ""), std::string([roleData.country UTF8String] ?: "")); signer.setUserAgent([MoppLibManager userAgent:true].UTF8String); std::vector roles; - for (NSString *role in roleData.ROLES) { + for (NSString *role in roleData.roles) { if (role != (id)[NSNull null] && [role length] != 0) { roles.push_back(std::string([role UTF8String] ?: "")); } diff --git a/MoppLib/MoppLib/PublicInterface/MoppLib.h b/MoppLib/MoppLib/PublicInterface/MoppLib.h index e9a640aeb..3ca1ef8b5 100644 --- a/MoppLib/MoppLib/PublicInterface/MoppLib.h +++ b/MoppLib/MoppLib/PublicInterface/MoppLib.h @@ -30,11 +30,5 @@ FOUNDATION_EXPORT double MoppLibVersionNumber; FOUNDATION_EXPORT const unsigned char MoppLibVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import -#import #import -#import #import -#import -#import -#import -#import diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibConfiguration.h b/MoppLib/MoppLib/PublicInterface/MoppLibConfiguration.h deleted file mode 100644 index a2edbbf6b..000000000 --- a/MoppLib/MoppLib/PublicInterface/MoppLibConfiguration.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// Configuration.h -// MoppLib -// -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import - -@interface MoppLibConfiguration : NSObject - -@property (nonatomic, strong) NSString *SIVAURL; -@property (nonatomic, strong) NSString *TSLURL; -@property (nonatomic, strong) NSArray *TSLCERTS; -@property (nonatomic, strong) NSArray *LDAPCERTS; -@property (nonatomic, strong) NSString *TSAURL; -@property (nonatomic, strong) NSDictionary *OCSPISSUERS; -@property (nonatomic, strong) NSArray *CERTBUNDLE; -@property (nonatomic, strong) NSString *TSACERT; - -- (id) initWithConfiguration:(NSString *)SIVAURL TSLURL:(NSString *)TSLURL TSLCERTS:(NSArray *)TSLCERTS LDAPCERTS:(NSArray *)LDAPCERTS TSAURL:(NSString *)TSAURL OCSPISSUERS:(NSDictionary *)OCSPISSUERS CERTBUNDLE:(NSArray *)CERTBUNDLE TSACERT:(NSString *)TSACERT; - -@end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibConfiguration.m b/MoppLib/MoppLib/PublicInterface/MoppLibConfiguration.swift similarity index 50% rename from MoppLib/MoppLib/PublicInterface/MoppLibConfiguration.m rename to MoppLib/MoppLib/PublicInterface/MoppLibConfiguration.swift index 772652475..9cf70690a 100644 --- a/MoppLib/MoppLib/PublicInterface/MoppLibConfiguration.m +++ b/MoppLib/MoppLib/PublicInterface/MoppLibConfiguration.swift @@ -1,5 +1,5 @@ // -// MOPPLibConfiguration.m +// MoppLibConfiguration.swift // MoppLib // /* @@ -21,24 +21,28 @@ * */ -#import "MOPPLibConfiguration.h" +import Foundation -@implementation MoppLibConfiguration +@objcMembers +public class MoppLibConfiguration: NSObject { -- (id) initWithConfiguration:(NSString *)SIVAURL TSLURL:(NSString *)TSLURL TSLCERTS:(NSArray *)TSLCERTS LDAPCERTS:(NSArray *)LDAPCERTS TSAURL:(NSString *)TSAURL OCSPISSUERS:(NSDictionary *)OCSPISSUERS CERTBUNDLE:(NSArray *)CERTBUNDLE TSACERT:(NSString *)TSACERT { - self = [super init]; - if (self) { - self.SIVAURL = SIVAURL; - self.TSLURL = TSLURL; - self.TSLCERTS = TSLCERTS; - self.LDAPCERTS = LDAPCERTS; - self.TSAURL = TSAURL; - self.OCSPISSUERS = OCSPISSUERS; - self.CERTBUNDLE = CERTBUNDLE; - self.TSACERT = TSACERT; + public var sivaURL: String + public var tslURL: String + public var tslCerts: [String] + public var ldapCerts: [String] + public var tsaURL: String + public var ocspIssuers: [String: String] + public var certBundle: [String] + public var tsaCert: String + + public init(sivaURL: String, tslURL: String, tslCerts: [String], ldapCerts: [String], tsaURL: String, ocspIssuers: [String : String], certBundle: [String], tsaCert: String) { + self.sivaURL = sivaURL + self.tslURL = tslURL + self.tslCerts = tslCerts + self.ldapCerts = ldapCerts + self.tsaURL = tsaURL + self.ocspIssuers = ocspIssuers + self.certBundle = certBundle + self.tsaCert = tsaCert } - - return self; } - -@end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibConstants.h b/MoppLib/MoppLib/PublicInterface/MoppLibConstants.h index d17eaeeba..5d4708acf 100644 --- a/MoppLib/MoppLib/PublicInterface/MoppLibConstants.h +++ b/MoppLib/MoppLib/PublicInterface/MoppLibConstants.h @@ -23,19 +23,8 @@ #import -typedef NS_ENUM(int, MoppLibSignatureStatus) { - Valid, - Warning, - NonQSCD, - Invalid, - UnknownStatus -}; - @class MoppLibContainer; -@class CdocInfo; -typedef void (^FailureBlock)(NSError *error); -typedef void (^ContainerBlock)(MoppLibContainer *container); -typedef void (^CdocContainerBlock)(CdocInfo *cdocInfo); -typedef void (^DecryptedDataBlock)(NSMutableDictionary *decryptedData); +typedef void (^FailureBlock)(NSError * _Nonnull error); +typedef void (^ContainerBlock)(MoppLibContainer * _Nonnull container); typedef void (^VoidBlock)(void); diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibContainer.h b/MoppLib/MoppLib/PublicInterface/MoppLibContainer.h deleted file mode 100644 index 18fecd527..000000000 --- a/MoppLib/MoppLib/PublicInterface/MoppLibContainer.h +++ /dev/null @@ -1,45 +0,0 @@ -// -// MoppLibContainer.h -// MoppLib -// -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import - -@interface MoppLibContainer : NSObject - -@property (strong, nonatomic) NSString *fileName; -@property (strong, nonatomic) NSString *filePath; -@property (strong, nonatomic) NSArray *dataFiles; -@property (strong, nonatomic) NSArray *signatures; -@property (strong, nonatomic) NSArray *timestampTokens; - -- (BOOL)isSigned; -- (BOOL)isEmpty; -- (BOOL)isDdoc; -- (BOOL)isBdoc; -- (BOOL)isAsice; -- (BOOL)isAsics; -- (BOOL)isSignable; -- (BOOL)isLegacy; - -- (NSString *)fileNameWithoutExtension; -- (NSString *)getNextSignatureId; -@end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibContainer.m b/MoppLib/MoppLib/PublicInterface/MoppLibContainer.m deleted file mode 100644 index c9bda4a2e..000000000 --- a/MoppLib/MoppLib/PublicInterface/MoppLibContainer.m +++ /dev/null @@ -1,83 +0,0 @@ -// -// MoppLibContainer.m -// MoppLib -// -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import "MoppLibContainer.h" -#import "MoppLibDataFile.h" - -@implementation MoppLibContainer - -- (BOOL)isSigned { - return self.signatures.count != 0; -} - -- (BOOL)isEmpty { - return self.dataFiles.count != 0; -} - -- (BOOL)isDdoc { - return [[self.fileName lowercaseString] hasSuffix:@".ddoc"]; -} - -- (BOOL)isAsice { - NSString *lowerCaseFilename = [self.fileName lowercaseString]; - return [lowerCaseFilename hasSuffix:@".asice"] || [lowerCaseFilename hasSuffix:@".sce"]; -} - -- (BOOL)isAsics { - NSString *lowerCaseFilename = [self.fileName lowercaseString]; - return [lowerCaseFilename hasSuffix:@".asics"] || [lowerCaseFilename hasSuffix:@".scs"]; -} - -- (BOOL)isBdoc { - return [[self.fileName lowercaseString] hasSuffix:@".bdoc"]; -} - -- (BOOL)isLegacy { - NSString *fileNameLowercase = [self.fileName lowercaseString]; - return - [fileNameLowercase hasSuffix:@".adoc"] || - [fileNameLowercase hasSuffix:@".edoc"] || - [fileNameLowercase hasSuffix:@".ddoc"]; -} - -- (BOOL)isSignable { - return [self isBdoc] || [self isAsice]; -} - -- (NSString *)getNextSignatureId { - NSMutableArray *exitingIds = [[NSMutableArray alloc] init]; - for (MoppLibDataFile *dataFile in self.dataFiles) { - [exitingIds addObject:dataFile.fileId]; - } - int nextId = 0; - while ([exitingIds containsObject:[NSString stringWithFormat:@"S%d", nextId]]) { - ++nextId; - } - return [NSString stringWithFormat:@"S%d", nextId]; -} - -- (NSString *)fileNameWithoutExtension { - return [self.fileName stringByDeletingPathExtension]; -} - -@end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibContainer.swift b/MoppLib/MoppLib/PublicInterface/MoppLibContainer.swift new file mode 100644 index 000000000..a297b4d51 --- /dev/null +++ b/MoppLib/MoppLib/PublicInterface/MoppLibContainer.swift @@ -0,0 +1,82 @@ +// +// MoppLibContainer.swift +// MoppLib +// +/* + * Copyright 2017 - 2024 Riigi Infosüsteemi Amet + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +import Foundation + +@objcMembers +public class MoppLibContainer: NSObject { + + public var fileName: String = "" + public var filePath: String = "" + public var dataFiles: [MoppLibDataFile] = [] + public var signatures: [MoppLibSignature] = [] + public var timestampTokens: [MoppLibSignature] = [] + + func isSigned() -> Bool { + return !signatures.isEmpty + } + + func isEmpty() -> Bool { + return dataFiles.isEmpty + } + + public func isDdoc() -> Bool { + return fileName.lowercased().hasSuffix(".ddoc") + } + + func isBdoc() -> Bool { + return fileName.lowercased().hasSuffix(".bdoc") + } + + func isAsice() -> Bool { + let lowerFileName = fileName.lowercased() + return lowerFileName.hasSuffix(".asice") || lowerFileName.hasSuffix(".sce") + } + + public func isAsics() -> Bool { + let lowerFileName = fileName.lowercased() + return lowerFileName.hasSuffix(".asics") || lowerFileName.hasSuffix(".scs") + } + + func isLegacy() -> Bool { + let lowerFileName = fileName.lowercased() + return lowerFileName.hasSuffix(".adoc") || lowerFileName.hasSuffix(".edoc") || lowerFileName.hasSuffix(".ddoc") + } + + public func isSignable() -> Bool { + return isBdoc() || isAsice() + } + + func getNextSignatureId() -> String { + let existingIds = dataFiles.map { $0.fileId } + var nextId = 0 + while existingIds.contains("S\(nextId)") { + nextId += 1 + } + return "S\(nextId)" + } + + func fileNameWithoutExtension() -> String { + return (fileName as NSString).deletingPathExtension + } +} diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.h b/MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.h index dc171eb1b..047b84849 100644 --- a/MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.h +++ b/MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.h @@ -21,10 +21,11 @@ * */ -#import "MoppLibContainer.h" -#import "MoppLibSignature.h" #import "MoppLibConstants.h" -#import "MoppLibRoleAddressData.h" + +@class MoppLibContainer; +@class MoppLibSignature; +@class MoppLibRoleAddressData; @class MoppLibConfiguration; @class MoppLibProxyConfiguration; @@ -50,7 +51,7 @@ * @param success Block to be called on successful completion of action. Includes container data as MoppLibContainer. * @param failure Block to be called when action fails. Includes error. */ -- (void)openContainerWithPath:(NSString *)containerPath success:(ContainerBlock)success failure:(FailureBlock)failure; +- (void)openContainerWithPath:(NSString * _Nonnull)containerPath success:(ContainerBlock)success failure:(FailureBlock)failure; /** * Opens container at specified path. @@ -59,7 +60,7 @@ * @return MoppLibContainer Successful completion of action. Includes container data as MoppLibContainer. * @param error Error when opening container. */ -- (MoppLibContainer *)openContainerWithPath:(NSString *)containerPath error:(NSError **)error; +- (MoppLibContainer *)openContainerWithPath:(NSString * _Nonnull)containerPath error:(NSError **)error; /** * Creates container on specified path. @@ -97,7 +98,7 @@ * @param success Block to be called on successful completion of action. Includes container data as array of MoppLibContainer. * @param failure Block to be called when action fails. Includes error. */ -- (void)getContainersWithSuccess:(void(^)(NSArray *containers))success failure:(FailureBlock)failure; +- (void)getContainersWithSuccess:(void(^)(NSArray *containers))success failure:(FailureBlock)failure; @@ -119,7 +120,7 @@ * @param success Block to be called on successful completion of action. * @param failure Block to be called when action fails. Includes error. */ -- (void)container:(NSString *)containerPath saveDataFile:(NSString *)fileName to:(NSString *)path success:(VoidBlock)success failure:(FailureBlock)failure; +- (void)container:(NSString * _Nonnull)containerPath saveDataFile:(NSString *)fileName to:(NSString *)path success:(VoidBlock)success failure:(FailureBlock)failure; /** * Specifies if datafile in container is saveable. diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.mm b/MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.mm index a46551b9b..70277f806 100644 --- a/MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.mm +++ b/MoppLib/MoppLib/PublicInterface/MoppLibContainerActions.mm @@ -58,7 +58,7 @@ - (void)openContainerWithPath:(NSString *)containerPath success:(ContainerBlock) }); } -- (MoppLibContainer *)openContainerWithPath:(NSString *)containerPath error:(NSError **)error { +- (MoppLibContainer *)openContainerWithPath:(NSString * _Nonnull)containerPath error:(NSError **)error { return [[MoppLibDigidocManager sharedInstance] getContainerWithPath:containerPath error:error]; } @@ -114,7 +114,7 @@ - (void)removeSignature:(MoppLibSignature *)moppSignature fromContainerWithPath: }); } -- (void)container:(NSString *)containerPath saveDataFile:(NSString *)fileName to:(NSString *)path success:(VoidBlock)success failure:(FailureBlock)failure { +- (void)container:(NSString * _Nonnull)containerPath saveDataFile:(NSString *)fileName to:(NSString *)path success:(VoidBlock)success failure:(FailureBlock)failure { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [[MoppLibDigidocManager sharedInstance] container:containerPath saveDataFile:fileName to:path success:^{ dispatch_async(dispatch_get_main_queue(), ^{ diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibCryptoActions.h b/MoppLib/MoppLib/PublicInterface/MoppLibCryptoActions.h deleted file mode 100644 index daa0fd9a9..000000000 --- a/MoppLib/MoppLib/PublicInterface/MoppLibCryptoActions.h +++ /dev/null @@ -1,60 +0,0 @@ -// -// MoppLibCryptoActions.h -// MoppLib -// -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import "MoppLibConstants.h" - -@interface MoppLibCryptoActions : NSObject - -+ (MoppLibCryptoActions *)sharedInstance; - - /** - * Encrypt data and create CDOC container. - * - * @param fullPath Full path of encrypted file. - * @param dataFiles Data files to be encrypted. - * @param addressees Addressees of the encrypted file. - * @param success Block to be called on successful completion of action. - * @param failure Block to be called when action fails. Includes error. - */ -- (void)encryptData:(NSString *)fullPath withDataFiles:(NSArray*)dataFiles withAddressees:(NSArray*)addressees success:(VoidBlock)success failure:(FailureBlock)failure; - - - /** - * Decrypt CDOC container and get data files. - * - * @param fullPath Full path of encrypted file. - * @param pin1 PIN1 code. - * @param success Block to be called on successful completion of action. Includes decrypted data as NSMutableDictionary. - * @param failure Block to be called when action fails. Includes error. - */ -- (void)decryptData:(NSString *)fullPath withPin1:(NSString*)pin1 success:(DecryptedDataBlock)success failure:(FailureBlock)failure; - -/** - * Parse and get info of CDOC container. - * - * @param fullPath Full path of CDOC container file. - * @param success Block to be called on successful completion of action. Includes CDOC container info as CdocContainerBlock. - * @param failure Block to be called when action fails. Includes error. - */ -- (void)parseCdocInfo:(NSString *)fullPath success:(CdocContainerBlock)success failure:(FailureBlock)failure; - @end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibCryptoActions.m b/MoppLib/MoppLib/PublicInterface/MoppLibCryptoActions.m deleted file mode 100644 index a4d1b7f49..000000000 --- a/MoppLib/MoppLib/PublicInterface/MoppLibCryptoActions.m +++ /dev/null @@ -1,86 +0,0 @@ -// -// MoppLibCryptoActions.m -// MoppLib -// -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import "MoppLibCryptoActions.h" -#import - -#import -#import -#import -#import - -@implementation MoppLibCryptoActions - -+ (MoppLibCryptoActions *)sharedInstance { - static dispatch_once_t pred; - static MoppLibCryptoActions *sharedInstance = nil; - dispatch_once(&pred, ^{ - sharedInstance = [[self alloc] init]; - }); - return sharedInstance; -} - -- (void)parseCdocInfo:(NSString *)fullPath success:(CdocContainerBlock)success failure:(FailureBlock)failure { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - NSError *error = nil; - CdocParser *cdocParser = [CdocParser new]; - CdocInfo *response = [cdocParser parseCdocInfo:fullPath]; - if (response.addressees == nil || response.dataFiles == nil) { - error = [MoppLibError generalError]; - } - dispatch_async(dispatch_get_main_queue(), ^{ - error == nil ? success(response) : failure(error); - }); - }); -} - -- (void)decryptData:(NSString *)fullPath withPin1:(NSString*)pin1 success:(DecryptedDataBlock)success failure:(FailureBlock)failure { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - Decrypt *decrypter = [Decrypt new]; - SmartToken *smartToken = [SmartToken new]; - NSError *error = nil; - NSMutableDictionary *response = [decrypter decryptFile:fullPath withPin:pin1 withToken:smartToken error:&error]; - if(error == nil && response.count == 0) { - error = [MoppLibError generalError]; - } - dispatch_async(dispatch_get_main_queue(), ^{ - error == nil ? success(response) : failure(error); - }); - }); -} - -- (void)encryptData:(NSString *)fullPath withDataFiles:(NSArray*)dataFiles withAddressees:(NSArray*)addressees success:(VoidBlock)success failure:(FailureBlock)failure { - - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - Encrypt *encrypter = [[Encrypt alloc] init]; - NSError *error = nil; - if (![encrypter encryptFile:fullPath withDataFiles:dataFiles withAddressees:addressees]) { - error = [MoppLibError generalError]; - } - dispatch_async(dispatch_get_main_queue(), ^{ - error == nil ? success() : failure(error); - }); - }); -} - -@end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibCryptoActions.swift b/MoppLib/MoppLib/PublicInterface/MoppLibCryptoActions.swift new file mode 100644 index 000000000..ada6b4af4 --- /dev/null +++ b/MoppLib/MoppLib/PublicInterface/MoppLibCryptoActions.swift @@ -0,0 +1,48 @@ +// +// MoppLibCryptoActions.swift +// MoppLib +// +/* + * Copyright 2017 - 2024 Riigi Infosüsteemi Amet + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +import CryptoLib + +public class MoppLibCryptoActions { + + /** + * Decrypt CDOC container and get data files. + * + * @param fullPath Full path of encrypted file. + * @param pin1 PIN1 code. + * @param success Block to be called on successful completion of action. Includes decrypted data as NSMutableDictionary. + * @param failure Block to be called when action fails. Includes error. + */ + static public func decryptData(fullPath: String, pin1: String) async throws -> [String: Data] { + try await withUnsafeThrowingContinuation { continuation in + DispatchQueue.global(qos: .background).async { + do { + let result = try Decrypt.decryptFile(fullPath, withPin: pin1, with: SmartToken()) + DispatchQueue.main.async { continuation.resume(returning: result) } + } catch { + DispatchQueue.main.async { continuation.resume(throwing: error) } + } + } + } + } +} diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibSignature.m b/MoppLib/MoppLib/PublicInterface/MoppLibDataFile.swift similarity index 64% rename from MoppLib/MoppLib/PublicInterface/MoppLibSignature.m rename to MoppLib/MoppLib/PublicInterface/MoppLibDataFile.swift index ada03c219..1371c4457 100644 --- a/MoppLib/MoppLib/PublicInterface/MoppLibSignature.m +++ b/MoppLib/MoppLib/PublicInterface/MoppLibDataFile.swift @@ -1,5 +1,5 @@ // -// MoppLibSignature.m +// MoppLibDataFile.swift // MoppLib // /* @@ -21,8 +21,17 @@ * */ -#import "MoppLibSignature.h" +@objcMembers +public class MoppLibDataFile : NSObject { + public let fileName: String + public let mediaType: String + public let fileId: String + public let fileSize: CUnsignedLong -@implementation MoppLibSignature - -@end + public init(fileName: String, mediaType: String, fileId: String, fileSize: CUnsignedLong) { + self.fileName = fileName + self.mediaType = mediaType + self.fileId = fileId + self.fileSize = fileSize + } +} diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibDataFile.m b/MoppLib/MoppLib/PublicInterface/MoppLibDigidocValidateOnline.swift similarity index 78% rename from MoppLib/MoppLib/PublicInterface/MoppLibDataFile.m rename to MoppLib/MoppLib/PublicInterface/MoppLibDigidocValidateOnline.swift index 3b0c24e83..488a3d90f 100644 --- a/MoppLib/MoppLib/PublicInterface/MoppLibDataFile.m +++ b/MoppLib/MoppLib/PublicInterface/MoppLibDigidocValidateOnline.swift @@ -1,5 +1,5 @@ // -// MoppLibDataFile.m +// MoppLibDigidocValidateOnline.swift // MoppLib // /* @@ -21,9 +21,10 @@ * */ -#import "MoppLibDataFile.h" -#import +import Foundation -@implementation MoppLibDataFile - -@end +@objcMembers +public class MoppLibDigidocValidateOnline: NSObject { + static public let shared = MoppLibDigidocValidateOnline() + public var validateOnline = true +} diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibManager.h b/MoppLib/MoppLib/PublicInterface/MoppLibManager.h new file mode 100644 index 000000000..567a0277d --- /dev/null +++ b/MoppLib/MoppLib/PublicInterface/MoppLibManager.h @@ -0,0 +1,47 @@ +// +// MoppLibManager.h +// MoppLib +// +/* + * Copyright 2017 - 2024 Riigi Infosüsteemi Amet + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#import "MoppLibConstants.h" + +@class MoppLibConfiguration; +@class MoppLibProxyConfiguration; +@class MoppLibRoleAddressData; + +@interface MoppLibManager : NSObject + ++ (MoppLibManager *)sharedInstance; + +/** + * Prepares library for operations with containers. Setup must be completed before any container action is carried out. It is recommended, that you initiate setup at earliest opportunity. + * + * @param success Block to be called on successful completion of action. + * @param failure Block to be called when action fails. Includes error. + */ +- (void)setupWithSuccess:(VoidBlock)success andFailure:(FailureBlock)failure andTSUrl:(NSString *)tsUrl withMoppConfiguration:(MoppLibConfiguration *)moppConfiguration andProxyConfiguration:(MoppLibProxyConfiguration*)proxyConfiguration; + +- (NSString *)libdigidocppVersion; +- (BOOL)isConnected; +- (NSString *)userAgent; +- (NSString *)userAgent:(BOOL)shouldIncludeDevices; + +@end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibManager.m b/MoppLib/MoppLib/PublicInterface/MoppLibManager.m new file mode 100644 index 000000000..8b115a922 --- /dev/null +++ b/MoppLib/MoppLib/PublicInterface/MoppLibManager.m @@ -0,0 +1,94 @@ +// +// MoppLibManager.m +// MoppLib +// +/* + * Copyright 2017 - 2024 Riigi Infosüsteemi Amet + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#import "MoppLibManager.h" +#import "MoppLibDigidocManager.h" +#import "../Reachability/Reachability.h" + +#import +#import + +@implementation MoppLibManager + ++ (MoppLibManager *)sharedInstance { + static dispatch_once_t pred; + static MoppLibManager *sharedInstance = nil; + dispatch_once(&pred, ^{ + sharedInstance = [[self alloc] init]; + }); + return sharedInstance; +} + +- (void)setupWithSuccess:(VoidBlock)success andFailure:(FailureBlock)failure andTSUrl:(NSString *)tsUrl withMoppConfiguration:(MoppLibConfiguration *)moppConfiguration andProxyConfiguration:(MoppLibProxyConfiguration*)proxyConfiguration { + [[MoppLibDigidocManager sharedInstance] setupWithSuccess:success andFailure:failure andTSUrl:tsUrl withMoppConfiguration: moppConfiguration andProxyConfiguration: proxyConfiguration]; +} + +- (NSString *)libdigidocppVersion { + return [[MoppLibDigidocManager sharedInstance] digidocVersion]; +} + +- (BOOL)isConnected { + Reachability *reachability = [Reachability reachabilityForInternetConnection]; + return [reachability currentReachabilityStatus] != NotReachable; +} + +- (NSArray *)connectedDevices { + EAAccessoryManager* accessoryManager = [EAAccessoryManager sharedAccessoryManager]; + NSMutableArray *devices = [NSMutableArray new]; + if (accessoryManager) { + for (EAAccessory *device in [accessoryManager connectedAccessories]) { + [devices addObject:[NSString stringWithFormat:@"%@ %@ (%@)", device.manufacturer, device.name, device.modelNumber]]; + } + } + return devices; +} + +- (NSString *)moppAppVersion { + NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"]; + NSString * build = [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey]; + return [NSString stringWithFormat:@"%@.%@", version, build]; +} + +- (NSString *)appLanguage { + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSString *language = [defaults stringForKey:@"kMoppLanguage"]; + return [language length] != 0 ? [NSString stringWithFormat:@"%@", language] : [NSString stringWithFormat:@"%s", "N/A"]; +} + +- (NSString *)userAgent { + return [self userAgent:false]; +} + +- (NSString *)userAgent:(BOOL)shouldIncludeDevices { + NSString *appInfo = [NSString stringWithFormat:@"%s/%@ (iOS %@) Lang: %@", "riadigidoc", [self moppAppVersion], + UIDevice.currentDevice.systemVersion, [self appLanguage]]; + if (shouldIncludeDevices) { + NSArray *connectedDevices = [self connectedDevices]; + if (connectedDevices.count > 0) { + appInfo = [NSString stringWithFormat:@"%@ Devices: %@", appInfo, [connectedDevices componentsJoinedByString:@", "]]; + } + } + return appInfo; +} + +@end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibProxyConfiguration.h b/MoppLib/MoppLib/PublicInterface/MoppLibProxyConfiguration.h deleted file mode 100644 index 018fff6c2..000000000 --- a/MoppLib/MoppLib/PublicInterface/MoppLibProxyConfiguration.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// MoppLibProxyConfiguration.h -// MoppLib -// -/* - * Copyright 2017 - 2023 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import - -@interface MoppLibProxyConfiguration : NSObject - -@property (nonatomic, strong) NSString *PROXYSETTING; -@property (nonatomic, strong) NSString *HOST; -@property (nonatomic, strong) NSNumber *PORT; -@property (nonatomic, strong) NSString *USERNAME; -@property (nonatomic, strong) NSString *PASSWORD; - -- (id) initWithConfiguration:(NSString *)PROXYSETTING HOST:(NSString *)HOST PORT:(NSNumber *)PORT USERNAME:(NSString *)USERNAME PASSWORD:(NSString *)PASSWORD; - -@end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibProxyConfiguration.m b/MoppLib/MoppLib/PublicInterface/MoppLibProxyConfiguration.m deleted file mode 100644 index 89348daae..000000000 --- a/MoppLib/MoppLib/PublicInterface/MoppLibProxyConfiguration.m +++ /dev/null @@ -1,41 +0,0 @@ -// -// MoppLibProxyConfiguration.m -// MoppLib -// -/* - * Copyright 2017 - 2023 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import "MoppLibProxyConfiguration.h" - -@implementation MoppLibProxyConfiguration - -- (id)initWithConfiguration:(NSString *)PROXYSETTING HOST:(NSString *)HOST PORT:(NSNumber *)PORT USERNAME:(NSString *)USERNAME PASSWORD:(NSString *)PASSWORD { - self = [super init]; - if (self) { - self.PROXYSETTING = PROXYSETTING; - self.HOST = HOST; - self.PORT = PORT; - self.USERNAME = USERNAME; - self.PASSWORD = PASSWORD; - } - - return self; -} - -@end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibDataFile.h b/MoppLib/MoppLib/PublicInterface/MoppLibProxyConfiguration.swift similarity index 68% rename from MoppLib/MoppLib/PublicInterface/MoppLibDataFile.h rename to MoppLib/MoppLib/PublicInterface/MoppLibProxyConfiguration.swift index 5c5443521..d9b63c43c 100644 --- a/MoppLib/MoppLib/PublicInterface/MoppLibDataFile.h +++ b/MoppLib/MoppLib/PublicInterface/MoppLibProxyConfiguration.swift @@ -1,9 +1,9 @@ // -// MoppLibDataFile.h +// MoppLibProxyConfiguration.swift // MoppLib // /* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet + * Copyright 2017 - 2023 Riigi Infosüsteemi Amet * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,13 +21,16 @@ * */ -#import +import Foundation -@interface MoppLibDataFile : NSObject +@objcMembers +public class MoppLibProxyConfiguration: NSObject { -@property (strong, nonatomic) NSString *mediaType; -@property (strong, nonatomic) NSString *fileId; -@property (strong, nonatomic) NSString *fileName; -@property (assign, nonatomic) long fileSize; + public let username: String + public let password: String -@end + public init(username: String, password: String) { + self.username = username + self.password = password + } +} diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibRoleAddressData.h b/MoppLib/MoppLib/PublicInterface/MoppLibRoleAddressData.h deleted file mode 100644 index b6b3bdc93..000000000 --- a/MoppLib/MoppLib/PublicInterface/MoppLibRoleAddressData.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// MoppLibRoleAddressData.h -// MoppLib -// -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import - -@interface MoppLibRoleAddressData : NSObject - -@property (nonatomic, strong) NSArray *ROLES; -@property (nonatomic, strong) NSString *CITY; -@property (nonatomic, strong) NSString *STATE; -@property (nonatomic, strong) NSString *COUNTRY; -@property (nonatomic, strong) NSString *ZIP; - -- (id) initWithRoles:(NSArray *)ROLES CITY:(NSString *)CITY STATE:(NSString *)STATE COUNTRY:(NSString *)COUNTRY ZIP:(NSString *)ZIP; - -@end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibRoleAddressData.m b/MoppLib/MoppLib/PublicInterface/MoppLibRoleAddressData.swift similarity index 62% rename from MoppLib/MoppLib/PublicInterface/MoppLibRoleAddressData.m rename to MoppLib/MoppLib/PublicInterface/MoppLibRoleAddressData.swift index a1d16b21c..77b9fe157 100644 --- a/MoppLib/MoppLib/PublicInterface/MoppLibRoleAddressData.m +++ b/MoppLib/MoppLib/PublicInterface/MoppLibRoleAddressData.swift @@ -1,5 +1,5 @@ // -// MoppLibRoleAddressData.m +// MoppLibRoleAddressData.swift // MoppLib // /* @@ -21,21 +21,23 @@ * */ -#import "MoppLibRoleAddressData.h" +import Foundation -@implementation MoppLibRoleAddressData +@objcMembers +public class MoppLibRoleAddressData: NSObject { -- (id) initWithRoles:(NSArray *)ROLES CITY:(NSString *)CITY STATE:(NSString *)STATE COUNTRY:(NSString *)COUNTRY ZIP:(NSString *)ZIP { - self = [super init]; - if (self) { - self.ROLES = ROLES; - self.CITY = CITY; - self.STATE = STATE; - self.COUNTRY = COUNTRY; - self.ZIP = ZIP; + public var roles: [String] + public var city: String + public var state: String + public var country: String + public var zip: String + + public init(roles: [String], city: String, state: String, country: String, zip: String) { + self.roles = roles + self.city = city + self.state = state + self.country = country + self.zip = zip + super.init() } - - return self; } - -@end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibSignature.h b/MoppLib/MoppLib/PublicInterface/MoppLibSignature.h deleted file mode 100644 index 11a2d2133..000000000 --- a/MoppLib/MoppLib/PublicInterface/MoppLibSignature.h +++ /dev/null @@ -1,55 +0,0 @@ -// -// MoppLibSignature.h -// MoppLib -// -/* - * Copyright 2017 - 2024 Riigi Infosüsteemi Amet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import "MoppLibConstants.h" - -@class MoppLibRoleAddressData; - -@interface MoppLibSignature : NSObject - -@property (strong, nonatomic) NSString *subjectName; -@property (strong, nonatomic) NSString *timestamp; -@property (assign, nonatomic) MoppLibSignatureStatus status; -@property (strong, nonatomic) NSString *diagnosticsInfo; -@property (strong, nonatomic) NSString *issuerName; -@property (strong, nonatomic) NSString *trustedSigningTime; -@property (strong, nonatomic) MoppLibRoleAddressData *roleAndAddressData; - -@property (strong, nonatomic) NSString *signersCertificateIssuer; -@property (strong, nonatomic) NSData *signingCertificate; -@property (strong, nonatomic) NSString *signatureMethod; -@property (strong, nonatomic) NSString *containerFormat; -@property (strong, nonatomic) NSString *signatureFormat; -@property (assign, nonatomic) NSInteger signedFileCount; -@property (strong, nonatomic) NSString *signatureTimestamp; -@property (strong, nonatomic) NSString *signatureTimestampUTC; -@property (strong, nonatomic) NSData *hashValueOfSignature; -@property (strong, nonatomic) NSString *tsCertificateIssuer; -@property (strong, nonatomic) NSData *tsCertificate; -@property (strong, nonatomic) NSString *ocspCertificateIssuer; -@property (strong, nonatomic) NSData *ocspCertificate; -@property (strong, nonatomic) NSString *ocspTime; -@property (strong, nonatomic) NSString *ocspTimeUTC; -@property (strong, nonatomic) NSString *signersMobileTimeUTC; - -@end diff --git a/MoppLib/MoppLib/PublicInterface/MoppLibSignature.swift b/MoppLib/MoppLib/PublicInterface/MoppLibSignature.swift new file mode 100644 index 000000000..614cff9d9 --- /dev/null +++ b/MoppLib/MoppLib/PublicInterface/MoppLibSignature.swift @@ -0,0 +1,61 @@ +// +// MoppLibSignature.swift +// MoppLib +// +/* + * Copyright 2017 - 2024 Riigi Infosüsteemi Amet + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +import Foundation + +@objc public enum MoppLibSignatureStatus: Int { + case Valid + case Warning + case NonQSCD + case Invalid + case UnknownStatus +} + +@objcMembers +public class MoppLibSignature: NSObject { + + public var subjectName: String = "" + public var timestamp: String = "" + public var status: MoppLibSignatureStatus = .UnknownStatus + public var diagnosticsInfo: String = "" + public var issuerName: String = "" + public var trustedSigningTime: String = "" + public var roleAndAddressData: MoppLibRoleAddressData = MoppLibRoleAddressData(roles: [], city: "", state: "", country: "", zip: "") + + public var signersCertificateIssuer: String = "" + public var signingCertificate: Data = Data() + public var signatureMethod: String = "" + public var containerFormat: String = "" + public var signatureFormat: String = "" + public var signedFileCount: Int = 0 + public var signatureTimestamp: String = "" + public var signatureTimestampUTC: String = "" + public var hashValueOfSignature: Data = Data() + public var tsCertificateIssuer: String = "" + public var tsCertificate: Data = Data() + public var ocspCertificateIssuer: String = "" + public var ocspCertificate: Data = Data() + public var ocspTime: String = "" + public var ocspTimeUTC: String = "" + public var signersMobileTimeUTC: String = "" +} diff --git a/MoppLib/MoppLib/SmartToken.swift b/MoppLib/MoppLib/SmartToken.swift index 5398a0fad..99d26b451 100644 --- a/MoppLib/MoppLib/SmartToken.swift +++ b/MoppLib/MoppLib/SmartToken.swift @@ -22,30 +22,33 @@ import CryptoLib -@objcMembers -public class SmartToken: NSObject, AbstractSmartToken { - public func getCertificate() throws -> Data { - guard let handler = CardActionsManager.shared.cardCommandHandler else { - throw MoppLibError.cardNotFoundError() +class SmartToken: AbstractSmartToken { + func getCertificate() throws -> Data { + return try processCryptoOperation { handler in + return try handler.readAuthenticationCertificate() } - return try handler.readAuthenticationCertificate() } - public func decrypt(_ data: Data, pin1: String) throws -> Data { - return try derive(data, pin1: pin1) + func decrypt(_ data: Data, pin1: String) throws -> Data { + return try processCryptoOperation { handler in + return try handler.decryptData(data, withPin1: pin1) + } } - public func derive(_ data: Data, pin1: String) throws -> Data { - guard let handler = CardActionsManager.shared.cardCommandHandler else { - throw MoppLibError.cardNotFoundError() + func derive(_ data: Data, pin1: String) throws -> Data { + return try decrypt(data, pin1: pin1) + } + + func authenticate(_ data: Data, pin1: String) throws -> Data { + return try processCryptoOperation { handler in + return try handler.authenticate(for: data, withPin1: pin1) } - return try handler.decryptData(data, withPin1: pin1) } - public func authenticate(_ data: Data, pin1: String) throws -> Data { + private func processCryptoOperation(_ operation: (@escaping (CardCommands) throws -> Data)) throws -> Data { guard let handler = CardActionsManager.shared.cardCommandHandler else { throw MoppLibError.cardNotFoundError() } - return try handler.authenticate(for: data, withPin1: pin1) + return try operation(handler) } } diff --git a/SkSigningLib/SkSigningLib/Requests/Mobile-ID/RequestSignature.swift b/SkSigningLib/SkSigningLib/Requests/Mobile-ID/RequestSignature.swift index e71b6aeb2..6ef0362fd 100644 --- a/SkSigningLib/SkSigningLib/Requests/Mobile-ID/RequestSignature.swift +++ b/SkSigningLib/SkSigningLib/Requests/Mobile-ID/RequestSignature.swift @@ -75,7 +75,7 @@ public class RequestSignature: NSObject, URLSessionDelegate, CertificateRequest var urlSessionConfiguration: URLSessionConfiguration let urlSession: URLSession - if let trustedCerts = trustedCertificates, !trustedCerts.isEmpty { + if !(trustedCerts?.isEmpty ?? true) { urlSessionConfiguration = URLSessionConfiguration.default ProxyUtil.configureURLSessionWithProxy(urlSessionConfiguration: &urlSessionConfiguration, manualProxyConf: manualProxyConf) ProxyUtil.setProxyAuthorizationHeader(request: &request, urlSessionConfiguration: urlSessionConfiguration, manualProxyConf: manualProxyConf) From f5ce050e96b263d2bfe668c49d057e2bd1eeec10 Mon Sep 17 00:00:00 2001 From: Raul Metsma Date: Fri, 17 Jan 2025 12:48:39 +0200 Subject: [PATCH 4/4] Settings Signed-off-by: Raul Metsma --- MoppApp/MoppApp.xcodeproj/project.pbxproj | 154 ++++++++++++++-- .../xcshareddata/xcschemes/MoppApp.xcscheme | 2 +- .../xcschemes/MoppAppTests.xcscheme | 2 +- .../xcschemes/shareExtension.xcscheme | 2 +- MoppApp/MoppApp/ContainerActions.swift | 2 +- MoppApp/MoppApp/ContainerViewController.swift | 6 +- MoppApp/MoppApp/DefaultsHelper.swift | 10 ++ MoppApp/MoppApp/FileManager.swift | 2 +- MoppApp/MoppApp/Info.plist | 82 ++++++++- MoppApp/MoppApp/MimeTypeExtractor.swift | 2 +- MoppApp/MoppApp/Settings.storyboard | 140 ++++++++++++--- MoppApp/MoppApp/SettingsViewController.swift | 25 ++- .../MoppApp/Signing/SigningCategoryCell.swift | 22 +++ MoppApp/MoppUI/SettingsEncryptingView.swift | 165 ++++++++++++++++++ MoppApp/MoppUI/ViewController.swift | 59 +++++++ 15 files changed, 624 insertions(+), 51 deletions(-) create mode 100644 MoppApp/MoppUI/SettingsEncryptingView.swift create mode 100644 MoppApp/MoppUI/ViewController.swift diff --git a/MoppApp/MoppApp.xcodeproj/project.pbxproj b/MoppApp/MoppApp.xcodeproj/project.pbxproj index 1093a7f69..12afb5eaf 100644 --- a/MoppApp/MoppApp.xcodeproj/project.pbxproj +++ b/MoppApp/MoppApp.xcodeproj/project.pbxproj @@ -30,12 +30,15 @@ 4E0F09ED2D76F6C0003F24B9 /* MoppLib.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DF15038F2AC5CFFA007222B2 /* MoppLib.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 4E0F09EE2D76F6C4003F24B9 /* SkSigningLib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF1503A02AC5D01A007222B2 /* SkSigningLib.framework */; }; 4E0F09EF2D76F6C4003F24B9 /* SkSigningLib.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DF1503A02AC5D01A007222B2 /* SkSigningLib.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4E0F0A1C2D76F87D003F24B9 /* SettingsEncryptingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E0F0A192D76F87D003F24B9 /* SettingsEncryptingView.swift */; }; + 4E0F0A1D2D76F87D003F24B9 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E0F0A1A2D76F87D003F24B9 /* ViewController.swift */; }; 4E167D872B6D346F001B74A1 /* digidocpp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E167D862B6D346F001B74A1 /* digidocpp.framework */; }; 4E167D882B6D346F001B74A1 /* digidocpp.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4E167D862B6D346F001B74A1 /* digidocpp.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 4E59080024B0F914001B23A6 /* SmartIDEditViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E5907FF24B0F914001B23A6 /* SmartIDEditViewController.swift */; }; 4E59080224B258C7001B23A6 /* SmartIDChallengeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E59080124B258C6001B23A6 /* SmartIDChallengeViewController.swift */; }; 4E59080424B2E295001B23A6 /* SmartIDSignature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E59080324B2E295001B23A6 /* SmartIDSignature.swift */; }; 4E6E1D9B2AAB493A008B3E74 /* NFCEditViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E6E1D9A2AAB493A008B3E74 /* NFCEditViewController.swift */; }; + 4EE43A752D515048002773BB /* libMoppUI.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EE43A652D514E3C002773BB /* libMoppUI.a */; }; 4EE56D232AB0561C002648EE /* NFCSignature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EE56D222AB0561C002648EE /* NFCSignature.swift */; }; 4EE56D272AB058A6002648EE /* SwiftECC in Frameworks */ = {isa = PBXBuildFile; productRef = 4EE56D262AB058A6002648EE /* SwiftECC */; }; 540786E91E1A76640016ABA7 /* UITextView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 540786E81E1A76640016ABA7 /* UITextView+Additions.swift */; }; @@ -44,7 +47,7 @@ 54825EF81E1D270F00253FF0 /* String+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54825EF71E1D270F00253FF0 /* String+Additions.swift */; }; 54825EFB1E1D28E900253FF0 /* UIColor+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54825EFA1E1D28E900253FF0 /* UIColor+Additions.swift */; }; 54A4182B1E83FAD200559E2B /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 54A418291E83FAD200559E2B /* MainInterface.storyboard */; }; - 54A4182F1E83FAD200559E2B /* shareExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 54A418241E83FAD200559E2B /* shareExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 54A4182F1E83FAD200559E2B /* shareExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 54A418241E83FAD200559E2B /* shareExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 54A5729F1E82AC760099BFAF /* AppStore.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54A5729E1E82AC760099BFAF /* AppStore.plist */; }; 54DC0DBF1E0BC0CD00C62B3D /* Landing.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 54DC0DBE1E0BC0CD00C62B3D /* Landing.storyboard */; }; C506EC7C1FB9CBFD00E07226 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C506EC7B1FB9CBFD00E07226 /* Constants.swift */; }; @@ -283,6 +286,13 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 4EE43A762D515048002773BB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = E4250CBB1E0968D200530370 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4EE43A642D514E3C002773BB; + remoteInfo = MoppUI; + }; 54A4182D1E83FAD200559E2B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = E4250CBB1E0968D200530370 /* Project object */; @@ -321,15 +331,15 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - 54A418331E83FAD200559E2B /* Embed App Extensions */ = { + 54A418331E83FAD200559E2B /* Embed Foundation Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 13; files = ( - 54A4182F1E83FAD200559E2B /* shareExtension.appex in Embed App Extensions */, + 54A4182F1E83FAD200559E2B /* shareExtension.appex in Embed Foundation Extensions */, ); - name = "Embed App Extensions"; + name = "Embed Foundation Extensions"; runOnlyForDeploymentPostprocessing = 0; }; E4250D081E0A911100530370 /* Embed Frameworks */ = { @@ -367,11 +377,14 @@ 39CDA7E920ADBCEB006E2E9F /* Crypto.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Crypto.storyboard; sourceTree = ""; }; 39CDA7ED20ADBE93006E2E9F /* CryptoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CryptoViewController.swift; sourceTree = ""; }; 39F8EFE620D263B5001BCF73 /* TokenFlow.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = TokenFlow.storyboard; sourceTree = ""; }; + 4E0F0A192D76F87D003F24B9 /* SettingsEncryptingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsEncryptingView.swift; sourceTree = ""; }; + 4E0F0A1A2D76F87D003F24B9 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 4E167D862B6D346F001B74A1 /* digidocpp.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = digidocpp.framework; path = "${DIGIDOCPP_PATH}/lib/digidocpp.framework"; sourceTree = ""; }; 4E5907FF24B0F914001B23A6 /* SmartIDEditViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SmartIDEditViewController.swift; sourceTree = ""; }; 4E59080124B258C6001B23A6 /* SmartIDChallengeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SmartIDChallengeViewController.swift; sourceTree = ""; }; 4E59080324B2E295001B23A6 /* SmartIDSignature.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SmartIDSignature.swift; sourceTree = ""; }; 4E6E1D9A2AAB493A008B3E74 /* NFCEditViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NFCEditViewController.swift; sourceTree = ""; }; + 4EE43A652D514E3C002773BB /* libMoppUI.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMoppUI.a; sourceTree = BUILT_PRODUCTS_DIR; }; 4EE56D222AB0561C002648EE /* NFCSignature.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NFCSignature.swift; sourceTree = ""; }; 540786E81E1A76640016ABA7 /* UITextView+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITextView+Additions.swift"; sourceTree = ""; }; 54825EF41E1CFE9600253FF0 /* Date+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Date+Additions.swift"; sourceTree = ""; }; @@ -649,6 +662,7 @@ 4E0F09EE2D76F6C4003F24B9 /* SkSigningLib.framework in Frameworks */, DF1503AB2AC5D1E5007222B2 /* ZIPFoundation in Frameworks */, 4EE56D272AB058A6002648EE /* SwiftECC in Frameworks */, + 4EE43A752D515048002773BB /* libMoppUI.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -696,6 +710,22 @@ name = "Token flow"; sourceTree = ""; }; + 4E0F0A1B2D76F87D003F24B9 /* MoppUI */ = { + isa = PBXGroup; + children = ( + 4E0F0A192D76F87D003F24B9 /* SettingsEncryptingView.swift */, + 4E0F0A1A2D76F87D003F24B9 /* ViewController.swift */, + ); + path = MoppUI; + sourceTree = ""; + }; + 4E8483B42D4F672B00C31A75 /* Encrypting */ = { + isa = PBXGroup; + children = ( + ); + path = Encrypting; + sourceTree = ""; + }; 540786E61E1A76280016ABA7 /* Extensions */ = { isa = PBXGroup; children = ( @@ -933,6 +963,7 @@ C593D9E6208F1972000B3BF6 /* Settings */ = { isa = PBXGroup; children = ( + 4E8483B42D4F672B00C31A75 /* Encrypting */, DF716E932B45CFD60004DCB6 /* Signing */, C55BB1C82090BF4A00618AC4 /* About */, DFC2ADBF29437778008A1CD2 /* Accessibility */, @@ -1108,6 +1139,7 @@ E4250CC51E0968D200530370 /* MoppApp */, 54A418251E83FAD200559E2B /* shareExtension */, DFF6A54E27E14C180055F8D5 /* MoppAppTests */, + 4E0F0A1B2D76F87D003F24B9 /* MoppUI */, E4250CC41E0968D200530370 /* Products */, F9074FEF4DC2DB83A60B75B9 /* Frameworks */, ); @@ -1118,6 +1150,7 @@ children = ( E4250CC31E0968D200530370 /* MoppApp.app */, 54A418241E83FAD200559E2B /* shareExtension.appex */, + 4EE43A652D514E3C002773BB /* libMoppUI.a */, ); name = Products; sourceTree = ""; @@ -1266,6 +1299,23 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 4EE43A642D514E3C002773BB /* MoppUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4EE43A712D514E3C002773BB /* Build configuration list for PBXNativeTarget "MoppUI" */; + buildPhases = ( + 4EE43A612D514E3C002773BB /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MoppUI; + packageProductDependencies = ( + ); + productName = MoppUI; + productReference = 4EE43A652D514E3C002773BB /* libMoppUI.a */; + productType = "com.apple.product-type.library.static"; + }; 54A418231E83FAD200559E2B /* shareExtension */ = { isa = PBXNativeTarget; buildConfigurationList = 54A418321E83FAD200559E2B /* Build configuration list for PBXNativeTarget "shareExtension" */; @@ -1294,13 +1344,14 @@ E4250CC01E0968D200530370 /* Frameworks */, E4250CC11E0968D200530370 /* Resources */, E4250D081E0A911100530370 /* Embed Frameworks */, - 54A418331E83FAD200559E2B /* Embed App Extensions */, + 54A418331E83FAD200559E2B /* Embed Foundation Extensions */, DF4FC5552AC5D3EE00910E4B /* Setup Firebase Crashlytics */, ); buildRules = ( ); dependencies = ( 54A4182E1E83FAD200559E2B /* PBXTargetDependency */, + 4EE43A772D515048002773BB /* PBXTargetDependency */, ); name = MoppApp; packageProductDependencies = ( @@ -1320,10 +1371,14 @@ E4250CBB1E0968D200530370 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1340; - LastUpgradeCheck = 1250; + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 1620; + LastUpgradeCheck = 1620; ORGANIZATIONNAME = "Riigi Infosüsteemi Amet"; TargetAttributes = { + 4EE43A642D514E3C002773BB = { + CreatedOnToolsVersion = 16.2; + }; 54A418231E83FAD200559E2B = { CreatedOnToolsVersion = 8.2.1; LastSwiftMigration = 0900; @@ -1346,10 +1401,9 @@ }; buildConfigurationList = E4250CBE1E0968D200530370 /* Build configuration list for PBXProject "MoppApp" */; compatibilityVersion = "Xcode 15.0"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( - English, en, Base, et, @@ -1383,6 +1437,7 @@ targets = ( E4250CC21E0968D200530370 /* MoppApp */, 54A418231E83FAD200559E2B /* shareExtension */, + 4EE43A642D514E3C002773BB /* MoppUI */, ); }; /* End PBXProject section */ @@ -1575,6 +1630,15 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 4EE43A612D514E3C002773BB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4E0F0A1C2D76F87D003F24B9 /* SettingsEncryptingView.swift in Sources */, + 4E0F0A1D2D76F87D003F24B9 /* ViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 54A418201E83FAD200559E2B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1788,6 +1852,11 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 4EE43A772D515048002773BB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4EE43A642D514E3C002773BB /* MoppUI */; + targetProxy = 4EE43A762D515048002773BB /* PBXContainerItemProxy */; + }; 54A4182E1E83FAD200559E2B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 54A418231E83FAD200559E2B /* shareExtension */; @@ -1817,6 +1886,46 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 4EE43A692D514E3C002773BB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 4EE43A6A2D514E3C002773BB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_FAST_MATH = YES; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; 54A418301E83FAD200559E2B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1877,11 +1986,10 @@ E4250CD81E0968D200530370 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -1912,9 +2020,10 @@ CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; + ENABLE_MODULE_VERIFIER = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_C_LANGUAGE_STANDARD = gnu17; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; @@ -1930,6 +2039,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; MARKETING_VERSION = 2.8.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -1939,11 +2049,10 @@ E4250CD91E0968D200530370 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -1974,9 +2083,10 @@ CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; + ENABLE_MODULE_VERIFIER = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_C_LANGUAGE_STANDARD = gnu17; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; @@ -1986,6 +2096,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; MARKETING_VERSION = 2.8.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; @@ -2010,6 +2121,7 @@ DEVELOPMENT_TEAM = ET847QJV9F; DIGIDOCPP_PATH = "$(SRCROOT)/../MoppLib/MoppLib/libdigidocpp/libdigidocpp.iphoneos"; "DIGIDOCPP_PATH[sdk=iphonesimulator*]" = "$(SRCROOT)/../MoppLib/MoppLib/libdigidocpp/libdigidocpp.iphonesimulator"; + ENABLE_MODULE_VERIFIER = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(DIGIDOCPP_PATH)/lib", @@ -2026,6 +2138,7 @@ "$(inherited)", "@executable_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -2057,6 +2170,7 @@ DEVELOPMENT_TEAM = ET847QJV9F; DIGIDOCPP_PATH = "$(SRCROOT)/../MoppLib/MoppLib/libdigidocpp/libdigidocpp.iphoneos"; "DIGIDOCPP_PATH[sdk=iphonesimulator*]" = "$(SRCROOT)/../MoppLib/MoppLib/libdigidocpp/libdigidocpp.iphonesimulator"; + ENABLE_MODULE_VERIFIER = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(DIGIDOCPP_PATH)/lib", @@ -2073,6 +2187,7 @@ "$(inherited)", "@executable_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -2090,6 +2205,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 4EE43A712D514E3C002773BB /* Build configuration list for PBXNativeTarget "MoppUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4EE43A692D514E3C002773BB /* Debug */, + 4EE43A6A2D514E3C002773BB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 54A418321E83FAD200559E2B /* Build configuration list for PBXNativeTarget "shareExtension" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/MoppApp/MoppApp.xcodeproj/xcshareddata/xcschemes/MoppApp.xcscheme b/MoppApp/MoppApp.xcodeproj/xcshareddata/xcschemes/MoppApp.xcscheme index a7d45afaa..ffe1614c1 100755 --- a/MoppApp/MoppApp.xcodeproj/xcshareddata/xcschemes/MoppApp.xcscheme +++ b/MoppApp/MoppApp.xcodeproj/xcshareddata/xcschemes/MoppApp.xcscheme @@ -1,6 +1,6 @@ Bool { guard let signingContainer = container, !signingContainer.filePath.isEmpty, - URL(fileURLWithPath: signingContainer.filePath).pathExtension != ContainerFormatCdoc else { + !URL(fileURLWithPath: signingContainer.filePath).pathExtension.isCryptoContainerExtension else { return false } @@ -860,7 +860,7 @@ extension ContainerViewController : ContainerHeaderDelegate { private func cdocContainerExists(container: CryptoContainer?) -> Bool { guard let cryptoContainer = container, !cryptoContainer.filePath.isEmpty, - URL(fileURLWithPath: cryptoContainer.filePath).pathExtension == ContainerFormatCdoc else { + URL(fileURLWithPath: cryptoContainer.filePath).pathExtension.isCryptoContainerExtension else { return false } @@ -919,7 +919,7 @@ extension ContainerViewController : ContainerHeaderDelegate { return } - let isContainerCdoc: Bool = containerExtension == ContainerFormatCdoc + let isContainerCdoc: Bool = containerExtension.isCryptoContainerExtension guard let newContainerPath: URL = self.getNewContainerUrlPath(isContainerCdoc: isContainerCdoc, asicContainer: asicContainer, cdocContainer: cdocContainer, newContainerName: textFieldText, containerExtension: containerExtension), newContainerPath.isFileURL else { printLog("Failed to get container path") diff --git a/MoppApp/MoppApp/DefaultsHelper.swift b/MoppApp/MoppApp/DefaultsHelper.swift index 34d65e18a..5d30b92b8 100644 --- a/MoppApp/MoppApp/DefaultsHelper.swift +++ b/MoppApp/MoppApp/DefaultsHelper.swift @@ -23,6 +23,7 @@ import Foundation import SkSigningLib +import MoppUI let ContainerFormatAdoc = "adoc" let ContainerFormatBdoc = "bdoc" @@ -391,4 +392,13 @@ class DefaultsHelper return UserDefaults.standard.bool(forKey: kNfcShowCanMessage) } } + + class var useCDoc2Encryption: Bool { + set { + UserDefaults.standard.set(newValue, forKey: kUseCDoc2Encryption) + } + get { + return UserDefaults.standard.bool(forKey: kUseCDoc2Encryption) + } + } } diff --git a/MoppApp/MoppApp/FileManager.swift b/MoppApp/MoppApp/FileManager.swift index ed6377047..87e6ed736 100644 --- a/MoppApp/MoppApp/FileManager.swift +++ b/MoppApp/MoppApp/FileManager.swift @@ -276,7 +276,7 @@ class MoppFileManager { completionHandler(true, saveTempFileToLocation) return }, failure: { (error) in - printLog("Failed to save file. Error: \(error.localizedDescription ?? "No error to display")") + printLog("Failed to save file. Error: \(error.localizedDescription)") completionHandler(false, nil) return }) diff --git a/MoppApp/MoppApp/Info.plist b/MoppApp/MoppApp/Info.plist index 4a73aec60..4e9e42c54 100644 --- a/MoppApp/MoppApp/Info.plist +++ b/MoppApp/MoppApp/Info.plist @@ -3,7 +3,7 @@ CFBundleDevelopmentRegion - en + $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName RIA DigiDoc CFBundleDocumentTypes @@ -198,6 +198,21 @@ public.data + + CFBundleIconFiles + + digidoc_76.png + digidoc_1024.png + + CFBundleTypeName + DigiDoc file cdoc2 + LSHandlerRank + Owner + LSItemContentTypes + + ee.ria.digidoc-cdoc2 + + CFBundleExecutable $(EXECUTABLE_NAME) @@ -234,8 +249,6 @@ LSSupportsOpeningDocumentsInPlace - NFCReaderUsageDescription - This app uses NFC to scan ID-cards NSAppTransportSecurity NSExceptionDomains @@ -252,6 +265,8 @@ + NFCReaderUsageDescription + This app uses NFC to scan ID-cards NSBluetoothAlwaysUsageDescription Bluetooth card reader is used to read data from ID card NSBluetoothPeripheralUsageDescription @@ -286,7 +301,7 @@ LaunchScreen UIRequiredDeviceCapabilities - armv7 + arm64 UIStatusBarStyle UIStatusBarStyleDarkContent @@ -713,6 +728,35 @@ + + CFBundleIconFiles + + digidoc_76.png + digidoc_1024.png + + UTTypeConformsTo + + public.data + + UTTypeDescription + DigiDoc Container cdoc2 + UTTypeIconFiles + + UTTypeIdentifier + ee.ria.digidoc-cdoc2 + UTTypeTagSpecification + + public.filename-extension + + cdoc2 + CDOC2 + + public.mime-type + + application/x-cdoc2 + + + UTImportedTypeDeclarations @@ -1095,6 +1139,36 @@ + + CFBundleIconFiles + + digidoc_76.png + digidoc_1024.png + + UTTypeConformsTo + + public.data + public.cdoc2 + + UTTypeDescription + Digidoc Container cdoc2 + UTTypeIconFiles + + UTTypeIdentifier + ee.ria.digidoc + UTTypeTagSpecification + + public.filename-extension + + cdoc2 + CDOC2 + + public.mime-type + + application/x-cdoc2 + + + com.apple.developer.nfc.readersession.iso7816.select-identifiers diff --git a/MoppApp/MoppApp/MimeTypeExtractor.swift b/MoppApp/MoppApp/MimeTypeExtractor.swift index 7e93b7659..3b2403ed7 100644 --- a/MoppApp/MoppApp/MimeTypeExtractor.swift +++ b/MoppApp/MoppApp/MimeTypeExtractor.swift @@ -255,7 +255,7 @@ class MimeTypeExtractor { var isCdoc: Bool = false MimeTypeDecoder().getMimeType(fileString: fileDataAscii ?? "") { (containerExtension) in - if containerExtension == ContainerFormatCdoc { + if containerExtension.isCryptoContainerExtension { isCdoc = true } } diff --git a/MoppApp/MoppApp/Settings.storyboard b/MoppApp/MoppApp/Settings.storyboard index ae77e9833..95c368586 100644 --- a/MoppApp/MoppApp/Settings.storyboard +++ b/MoppApp/MoppApp/Settings.storyboard @@ -1,9 +1,9 @@ - + - + @@ -189,21 +189,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -253,7 +341,7 @@ - + @@ -291,7 +379,7 @@ - + @@ -426,7 +514,7 @@