mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
4.7 KiB
Swift
108 lines
4.7 KiB
Swift
//
|
|
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import SignalCoreKit
|
|
|
|
public enum SMKCertificateError: Error {
|
|
case invalidCertificate(description: String)
|
|
}
|
|
|
|
@objc public protocol SMKCertificateValidator: class {
|
|
|
|
@objc func throwswrapped_validate(senderCertificate: SMKSenderCertificate, validationTime: UInt64) throws
|
|
|
|
@objc func throwswrapped_validate(serverCertificate: SMKServerCertificate) throws
|
|
}
|
|
|
|
// See: https://github.com/signalapp/libsignal-metadata-java/blob/master/java/src/main/java/org/signal/libsignal/metadata/certificate/CertificateValidator.java
|
|
//public class CertificateValidator {
|
|
@objc public class SMKCertificateDefaultValidator: NSObject, SMKCertificateValidator {
|
|
|
|
// @SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
|
|
// private static final Set<Integer> REVOKED = new HashSet<Integer>() {{
|
|
//
|
|
// }};
|
|
private static let kRevokedCertificateIds = Set<UInt32>()
|
|
|
|
//
|
|
// private final ECPublicKey trustRoot;
|
|
private let trustRoot: ECPublicKey
|
|
|
|
// public CertificateValidator(ECPublicKey trustRoot) {
|
|
// this.trustRoot = trustRoot;
|
|
// }
|
|
@objc public init(trustRoot: ECPublicKey ) {
|
|
self.trustRoot = trustRoot
|
|
}
|
|
|
|
// public void validate(SenderCertificate certificate, long validationTime) throws InvalidCertificateException {
|
|
@objc public func throwswrapped_validate(senderCertificate: SMKSenderCertificate, validationTime: UInt64) throws {
|
|
// try {
|
|
// ServerCertificate serverCertificate = certificate.getSigner();
|
|
// let serverCertificate = senderCertificate.signer
|
|
|
|
// validate(serverCertificate);
|
|
// try throwswrapped_validate(serverCertificate: serverCertificate)
|
|
|
|
// if (!Curve.verifySignature(serverCertificate.getKey(), certificate.getCertificate(), certificate.getSignature())) {
|
|
// throw new InvalidCertificateException("Signature failed");
|
|
// }
|
|
// let certificateData = try senderCertificate.toProto().certificate
|
|
// guard try Ed25519.verifySignature(senderCertificate.signatureData,
|
|
// publicKey: serverCertificate.key.keyData,
|
|
// data: certificateData) else {
|
|
// Logger.error("Sender certificate signature verification failed.")
|
|
// let error = SMKCertificateError.invalidCertificate(description: "Sender certificate signature verification failed.")
|
|
// Logger.error("\(error)")
|
|
// throw error
|
|
// }
|
|
|
|
// if (validationTime > certificate.getExpiration()) {
|
|
// throw new InvalidCertificateException("Certificate is expired");
|
|
// }
|
|
// guard validationTime <= senderCertificate.expirationTimestamp else {
|
|
// let error = SMKCertificateError.invalidCertificate(description: "Certficate is expired.")
|
|
// Logger.error("\(error)")
|
|
// throw error
|
|
// }
|
|
|
|
// } catch (InvalidKeyException e) {
|
|
// throw new InvalidCertificateException(e);
|
|
// }
|
|
}
|
|
|
|
// // VisibleForTesting
|
|
// void validate(ServerCertificate certificate) throws InvalidCertificateException {
|
|
@objc public func throwswrapped_validate(serverCertificate: SMKServerCertificate) throws {
|
|
// try {
|
|
// if (!Curve.verifySignature(trustRoot, certificate.getCertificate(), certificate.getSignature())) {
|
|
// throw new InvalidCertificateException("Signature failed");
|
|
// }
|
|
let certificateBuilder = SMKProtoServerCertificateCertificate.builder(id: serverCertificate.keyId,
|
|
key: serverCertificate.key.serialized)
|
|
let certificateData = try certificateBuilder.build().serializedData()
|
|
|
|
// let certificateData = try serverCertificate.toProto().certificate
|
|
guard try Ed25519.verifySignature(serverCertificate.signatureData,
|
|
publicKey: trustRoot.keyData,
|
|
data: certificateData) else {
|
|
let error = SMKCertificateError.invalidCertificate(description: "Server certificate signature verification failed.")
|
|
Logger.error("\(error)")
|
|
throw error
|
|
}
|
|
// if (REVOKED.contains(certificate.getKeyId())) {
|
|
// throw new InvalidCertificateException("Server certificate has been revoked");
|
|
// }
|
|
guard !SMKCertificateDefaultValidator.kRevokedCertificateIds.contains(serverCertificate.keyId) else {
|
|
let error = SMKCertificateError.invalidCertificate(description: "Revoked certificate.")
|
|
Logger.error("\(error)")
|
|
throw error
|
|
}
|
|
// } catch (InvalidKeyException e) {
|
|
// throw new InvalidCertificateException(e);
|
|
// }
|
|
}
|
|
}
|