blob: 888bb603bffe705e50b26783bb289e27363863c0 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/web/public/ssl_status.h"
#import "ios/web_view/internal/cwv_ssl_status_internal.h"
#include "net/base/net_errors.h"
#include "net/cert/cert_status_flags.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace {
CWVSecurityStyle CWVSecurityStyleFromWebSecurityStyle(
web::SecurityStyle style) {
switch (style) {
case web::SECURITY_STYLE_UNKNOWN:
return CWVSecurityStyleUnknown;
case web::SECURITY_STYLE_UNAUTHENTICATED:
return CWVSecurityStyleUnauthenticated;
case web::SECURITY_STYLE_AUTHENTICATION_BROKEN:
return CWVSecurityStyleAuthenticationBroken;
case web::SECURITY_STYLE_AUTHENTICATED:
return CWVSecurityStyleAuthenticated;
}
}
} // namespace
CWVCertStatus CWVCertStatusFromNetCertStatus(net::CertStatus cert_status) {
CWVCertStatus cwv_status = 0;
if (cert_status & net::CERT_STATUS_COMMON_NAME_INVALID) {
cwv_status |= CWVCertStatusCommonNameInvalid;
}
if (cert_status & net::CERT_STATUS_DATE_INVALID) {
cwv_status |= CWVCertStatusDateInvalid;
}
if (cert_status & net::CERT_STATUS_AUTHORITY_INVALID) {
cwv_status |= CWVCertStatusAuthorityInvalid;
}
if (cert_status & net::CERT_STATUS_NO_REVOCATION_MECHANISM) {
cwv_status |= CWVCertStatusNoRevocationMechanism;
}
if (cert_status & net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION) {
cwv_status |= CWVCertStatusUnableToCheckRevocation;
}
if (cert_status & net::CERT_STATUS_REVOKED) {
cwv_status |= CWVCertStatusRevoked;
}
if (cert_status & net::CERT_STATUS_INVALID) {
cwv_status |= CWVCertStatusInvalid;
}
if (cert_status & net::CERT_STATUS_WEAK_SIGNATURE_ALGORITHM) {
cwv_status |= CWVCertStatusWeakSignatureAlgorithm;
}
if (cert_status & net::CERT_STATUS_NON_UNIQUE_NAME) {
cwv_status |= CWVCertStatusNonUniqueName;
}
if (cert_status & net::CERT_STATUS_WEAK_KEY) {
cwv_status |= CWVCertStatusWeakKey;
}
if (cert_status & net::CERT_STATUS_PINNED_KEY_MISSING) {
cwv_status |= CWVCertStatusPinnedKeyMissing;
}
if (cert_status & net::CERT_STATUS_NAME_CONSTRAINT_VIOLATION) {
cwv_status |= CWVCertStatusNameConstraintViolation;
}
if (cert_status & net::CERT_STATUS_VALIDITY_TOO_LONG) {
cwv_status |= CWVCertStatusValidityTooLong;
}
if (cert_status & net::CERT_STATUS_CERTIFICATE_TRANSPARENCY_REQUIRED) {
cwv_status |= CWVCertStatusCertificateTransparencyRequired;
}
if (cert_status & net::CERT_STATUS_SYMANTEC_LEGACY) {
cwv_status |= CWVCertStatusSymantecLegacy;
}
return cwv_status;
}
@implementation CWVSSLStatus {
web::SSLStatus _internalStatus;
}
- (instancetype)initWithInternalStatus:(const web::SSLStatus&)internalStatus {
self = [super init];
if (self) {
_internalStatus = internalStatus;
}
return self;
}
- (CWVSecurityStyle)securityStyle {
return CWVSecurityStyleFromWebSecurityStyle(_internalStatus.security_style);
}
- (BOOL)hasOnlySecureContent {
return _internalStatus.security_style == web::SECURITY_STYLE_AUTHENTICATED &&
!(_internalStatus.content_status &
web::SSLStatus::DISPLAYED_INSECURE_CONTENT);
}
- (CWVCertStatus)certStatus {
return CWVCertStatusFromNetCertStatus(_internalStatus.cert_status);
}
@end