2014-08-13 10:39:27 +01:00
//
// System.Security.Cryptography.X509Certificate2 class
//
// Author:
// Sebastien Pouliot <sebastien@ximian.com>
//
// (C) 2003 Motus Technologies Inc. (http://www.motus.com)
// Copyright (C) 2004-2006 Novell Inc. (http://www.novell.com)
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
2016-02-22 11:00:01 -05:00
#if MONO_SECURITY_ALIAS
2014-08-13 10:39:27 +01:00
extern alias MonoSecurity ;
using MonoSecurity : : Mono . Security ;
using MonoSecurity : : Mono . Security . Cryptography ;
using MX = MonoSecurity : : Mono . Security . X509 ;
2016-02-22 11:00:01 -05:00
#else
using Mono.Security ;
using Mono.Security.Cryptography ;
using MX = Mono . Security . X509 ;
2014-08-13 10:39:27 +01:00
#endif
using System.IO ;
using System.Text ;
2016-02-22 11:00:01 -05:00
using System.Collections ;
2016-11-10 13:04:39 +00:00
using System.Runtime.Serialization ;
2018-10-09 08:20:59 +00:00
using Microsoft.Win32.SafeHandles ;
2019-04-12 14:10:50 +00:00
using Internal.Cryptography ;
2018-10-09 08:20:59 +00:00
using Mono ;
2014-08-13 10:39:27 +01:00
2019-04-12 14:10:50 +00:00
namespace System.Security.Cryptography.X509Certificates
{
2014-08-13 10:39:27 +01:00
[Serializable]
2019-04-12 14:10:50 +00:00
public class X509Certificate2 : X509Certificate
{
volatile byte [ ] lazyRawData ;
volatile Oid lazySignatureAlgorithm ;
volatile int lazyVersion ;
volatile X500DistinguishedName lazySubjectName ;
volatile X500DistinguishedName lazyIssuerName ;
volatile PublicKey lazyPublicKey ;
volatile AsymmetricAlgorithm lazyPrivateKey ;
volatile X509ExtensionCollection lazyExtensions ;
public override void Reset ( )
{
lazyRawData = null ;
lazySignatureAlgorithm = null ;
lazyVersion = 0 ;
lazySubjectName = null ;
lazyIssuerName = null ;
lazyPublicKey = null ;
lazyPrivateKey = null ;
lazyExtensions = null ;
2014-08-13 10:39:27 +01:00
2019-04-12 14:10:50 +00:00
base . Reset ( ) ;
}
2014-08-13 10:39:27 +01:00
public X509Certificate2 ( )
2019-04-12 14:10:50 +00:00
: base ( )
2014-08-13 10:39:27 +01:00
{
}
public X509Certificate2 ( byte [ ] rawData )
2019-04-12 14:10:50 +00:00
: base ( rawData )
2014-08-13 10:39:27 +01:00
{
2019-02-04 20:11:37 +00:00
// MONO: temporary hack until `X509CertificateImplApple` derives from
// `X509Certificate2Impl`.
if ( rawData ! = null & & rawData . Length ! = 0 ) {
using ( var safePasswordHandle = new SafePasswordHandle ( ( string ) null ) ) {
var impl = X509Helper . Import ( rawData , safePasswordHandle , X509KeyStorageFlags . DefaultKeySet ) ;
ImportHandle ( impl ) ;
}
}
2014-08-13 10:39:27 +01:00
}
public X509Certificate2 ( byte [ ] rawData , string password )
2019-02-04 20:11:37 +00:00
: base ( rawData , password )
2014-08-13 10:39:27 +01:00
{
}
2019-04-12 14:10:50 +00:00
[CLSCompliantAttribute (false)]
2014-08-13 10:39:27 +01:00
public X509Certificate2 ( byte [ ] rawData , SecureString password )
2019-02-04 20:11:37 +00:00
: base ( rawData , password )
2014-08-13 10:39:27 +01:00
{
}
public X509Certificate2 ( byte [ ] rawData , string password , X509KeyStorageFlags keyStorageFlags )
2019-02-04 20:11:37 +00:00
: base ( rawData , password , keyStorageFlags )
2014-08-13 10:39:27 +01:00
{
}
2019-04-12 14:10:50 +00:00
[CLSCompliantAttribute (false)]
2014-08-13 10:39:27 +01:00
public X509Certificate2 ( byte [ ] rawData , SecureString password , X509KeyStorageFlags keyStorageFlags )
2019-02-04 20:11:37 +00:00
: base ( rawData , password , keyStorageFlags )
2014-08-13 10:39:27 +01:00
{
}
2019-04-12 14:10:50 +00:00
public X509Certificate2 ( IntPtr handle )
: base ( handle )
{
}
internal X509Certificate2 ( X509Certificate2Impl impl )
: base ( impl )
{
}
2014-08-13 10:39:27 +01:00
public X509Certificate2 ( string fileName )
2019-02-04 20:11:37 +00:00
: base ( fileName )
2014-08-13 10:39:27 +01:00
{
}
public X509Certificate2 ( string fileName , string password )
2019-02-04 20:11:37 +00:00
: base ( fileName , password )
2014-08-13 10:39:27 +01:00
{
}
public X509Certificate2 ( string fileName , SecureString password )
2019-02-04 20:11:37 +00:00
: base ( fileName , password )
2014-08-13 10:39:27 +01:00
{
}
public X509Certificate2 ( string fileName , string password , X509KeyStorageFlags keyStorageFlags )
2019-02-04 20:11:37 +00:00
: base ( fileName , password , keyStorageFlags )
2014-08-13 10:39:27 +01:00
{
}
public X509Certificate2 ( string fileName , SecureString password , X509KeyStorageFlags keyStorageFlags )
2019-02-04 20:11:37 +00:00
: base ( fileName , password , keyStorageFlags )
2014-08-13 10:39:27 +01:00
{
}
public X509Certificate2 ( X509Certificate certificate )
2019-02-04 20:11:37 +00:00
: base ( certificate )
2016-04-12 13:19:31 -04:00
{
}
2019-04-12 14:10:50 +00:00
protected X509Certificate2 ( SerializationInfo info , StreamingContext context )
: base ( info , context )
2014-08-13 10:39:27 +01:00
{
2019-04-12 14:10:50 +00:00
throw new PlatformNotSupportedException ( ) ;
2014-08-13 10:39:27 +01:00
}
public bool Archived {
2019-04-12 14:10:50 +00:00
get {
ThrowIfInvalid ( ) ;
return Impl . Archived ;
}
set {
ThrowIfInvalid ( ) ;
Impl . Archived = value ;
}
2014-08-13 10:39:27 +01:00
}
public X509ExtensionCollection Extensions {
2019-04-12 14:10:50 +00:00
get {
ThrowIfInvalid ( ) ;
X509ExtensionCollection extensions = lazyExtensions ;
if ( extensions = = null ) {
extensions = new X509ExtensionCollection ( ) ;
foreach ( X509Extension extension in Impl . Extensions ) {
X509Extension customExtension = CreateCustomExtensionIfAny ( extension . Oid ) ;
if ( customExtension = = null ) {
extensions . Add ( extension ) ;
} else {
customExtension . CopyFrom ( extension ) ;
extensions . Add ( customExtension ) ;
}
}
lazyExtensions = extensions ;
}
return extensions ;
}
2014-08-13 10:39:27 +01:00
}
public string FriendlyName {
get {
2018-10-09 08:20:59 +00:00
ThrowIfInvalid ( ) ;
2019-04-12 14:10:50 +00:00
return Impl . FriendlyName ;
2014-08-13 10:39:27 +01:00
}
2019-04-12 14:10:50 +00:00
2014-08-13 10:39:27 +01:00
set {
2018-10-09 08:20:59 +00:00
ThrowIfInvalid ( ) ;
2019-04-12 14:10:50 +00:00
Impl . FriendlyName = value ;
2014-08-13 10:39:27 +01:00
}
}
public bool HasPrivateKey {
2019-04-12 14:10:50 +00:00
get {
ThrowIfInvalid ( ) ;
return Impl . HasPrivateKey ;
}
}
public AsymmetricAlgorithm PrivateKey {
get {
ThrowIfInvalid ( ) ;
if ( ! HasPrivateKey )
return null ;
if ( lazyPrivateKey = = null ) {
switch ( GetKeyAlgorithm ( ) ) {
case Oids . RsaRsa :
lazyPrivateKey = Impl . GetRSAPrivateKey ( ) ;
break ;
case Oids . DsaDsa :
lazyPrivateKey = Impl . GetDSAPrivateKey ( ) ;
break ;
default :
// This includes ECDSA, because an Oids.Ecc key can be
// many different algorithm kinds, not necessarily with mutual exclusion.
//
// Plus, .NET Framework only supports RSA and DSA in this property.
throw new NotSupportedException ( SR . NotSupported_KeyAlgorithm ) ;
}
}
return lazyPrivateKey ;
}
set {
throw new PlatformNotSupportedException ( ) ;
}
2014-08-13 10:39:27 +01:00
}
public X500DistinguishedName IssuerName {
2019-04-12 14:10:50 +00:00
get {
ThrowIfInvalid ( ) ;
X500DistinguishedName issuerName = lazyIssuerName ;
if ( issuerName = = null )
issuerName = lazyIssuerName = Impl . IssuerName ;
return issuerName ;
}
}
2014-08-13 10:39:27 +01:00
public DateTime NotAfter {
2019-04-12 14:10:50 +00:00
get { return GetNotAfter ( ) ; }
2014-08-13 10:39:27 +01:00
}
public DateTime NotBefore {
2019-04-12 14:10:50 +00:00
get { return GetNotBefore ( ) ; }
2014-08-13 10:39:27 +01:00
}
2019-04-12 14:10:50 +00:00
public PublicKey PublicKey {
get {
ThrowIfInvalid ( ) ;
PublicKey publicKey = lazyPublicKey ;
if ( publicKey = = null ) {
string keyAlgorithmOid = GetKeyAlgorithm ( ) ;
byte [ ] parameters = GetKeyAlgorithmParameters ( ) ;
byte [ ] keyValue = GetPublicKey ( ) ;
Oid oid = new Oid ( keyAlgorithmOid ) ;
publicKey = lazyPublicKey = new PublicKey ( oid , new AsnEncodedData ( oid , parameters ) , new AsnEncodedData ( oid , keyValue ) ) ;
}
return publicKey ;
2019-02-04 20:11:37 +00:00
}
}
2014-08-13 10:39:27 +01:00
public byte [ ] RawData {
2019-04-12 14:10:50 +00:00
get {
ThrowIfInvalid ( ) ;
byte [ ] rawData = lazyRawData ;
if ( rawData = = null )
rawData = lazyRawData = Impl . RawData ;
return rawData . CloneByteArray ( ) ;
}
2016-04-12 13:19:31 -04:00
}
2014-08-13 10:39:27 +01:00
public string SerialNumber {
2019-04-12 14:10:50 +00:00
get {
return GetSerialNumberString ( ) ;
}
}
2014-08-13 10:39:27 +01:00
public Oid SignatureAlgorithm {
2019-04-12 14:10:50 +00:00
get {
ThrowIfInvalid ( ) ;
Oid signatureAlgorithm = lazySignatureAlgorithm ;
if ( signatureAlgorithm = = null ) {
string oidValue = Impl . SignatureAlgorithm ;
signatureAlgorithm = lazySignatureAlgorithm = Oid . FromOidValue ( oidValue , OidGroup . SignatureAlgorithm ) ;
}
return signatureAlgorithm ;
}
}
2014-08-13 10:39:27 +01:00
public X500DistinguishedName SubjectName {
2019-04-12 14:10:50 +00:00
get {
ThrowIfInvalid ( ) ;
2014-08-13 10:39:27 +01:00
2019-04-12 14:10:50 +00:00
X500DistinguishedName subjectName = lazySubjectName ;
if ( subjectName = = null )
subjectName = lazySubjectName = Impl . SubjectName ;
return subjectName ;
}
}
2014-08-13 10:39:27 +01:00
2019-04-12 14:10:50 +00:00
public string Thumbprint {
get {
byte [ ] thumbPrint = GetCertHash ( ) ;
return thumbPrint . ToHexStringUpper ( ) ;
}
2014-08-13 10:39:27 +01:00
}
2019-04-12 14:10:50 +00:00
public int Version {
get {
ThrowIfInvalid ( ) ;
2014-08-13 10:39:27 +01:00
2019-04-12 14:10:50 +00:00
int version = lazyVersion ;
if ( version = = 0 )
version = lazyVersion = Impl . Version ;
return version ;
}
2014-08-13 10:39:27 +01:00
}
2019-04-12 14:10:50 +00:00
public static X509ContentType GetCertContentType ( byte [ ] rawData )
2014-08-13 10:39:27 +01:00
{
2019-04-12 14:10:50 +00:00
if ( rawData = = null | | rawData . Length = = 0 )
throw new ArgumentException ( SR . Arg_EmptyOrNullArray , nameof ( rawData ) ) ;
return X509Pal . Instance . GetCertContentType ( rawData ) ;
2014-08-13 10:39:27 +01:00
}
2019-04-12 14:10:50 +00:00
public static X509ContentType GetCertContentType ( string fileName )
2014-08-13 10:39:27 +01:00
{
2019-04-12 14:10:50 +00:00
if ( fileName = = null )
throw new ArgumentNullException ( nameof ( fileName ) ) ;
// Desktop compat: The desktop CLR expands the filename to a full path for the purpose of performing a CAS permission check. While CAS is not present here,
// we still need to call GetFullPath() so we get the same exception behavior if the fileName is bad.
string fullPath = Path . GetFullPath ( fileName ) ;
return X509Pal . Instance . GetCertContentType ( fileName ) ;
2014-08-13 10:39:27 +01:00
}
2019-04-12 14:10:50 +00:00
public string GetNameInfo ( X509NameType nameType , bool forIssuer )
2014-08-13 10:39:27 +01:00
{
2019-04-12 14:10:50 +00:00
return Impl . GetNameInfo ( nameType , forIssuer ) ;
2014-08-13 10:39:27 +01:00
}
2019-04-12 14:10:50 +00:00
public override string ToString ( )
2014-08-13 10:39:27 +01:00
{
2019-04-12 14:10:50 +00:00
return base . ToString ( fVerbose : true ) ;
2014-08-13 10:39:27 +01:00
}
2019-04-12 14:10:50 +00:00
public override string ToString ( bool verbose )
2014-08-13 10:39:27 +01:00
{
2019-04-12 14:10:50 +00:00
if ( verbose = = false | | ! IsValid )
return ToString ( ) ;
StringBuilder sb = new StringBuilder ( ) ;
// Version
sb . AppendLine ( "[Version]" ) ;
sb . Append ( " V" ) ;
sb . Append ( Version ) ;
// Subject
sb . AppendLine ( ) ;
sb . AppendLine ( ) ;
sb . AppendLine ( "[Subject]" ) ;
sb . Append ( " " ) ;
sb . Append ( SubjectName . Name ) ;
string simpleName = GetNameInfo ( X509NameType . SimpleName , false ) ;
if ( simpleName . Length > 0 ) {
sb . AppendLine ( ) ;
sb . Append ( " " ) ;
sb . Append ( "Simple Name: " ) ;
sb . Append ( simpleName ) ;
}
string emailName = GetNameInfo ( X509NameType . EmailName , false ) ;
if ( emailName . Length > 0 ) {
sb . AppendLine ( ) ;
sb . Append ( " " ) ;
sb . Append ( "Email Name: " ) ;
sb . Append ( emailName ) ;
}
string upnName = GetNameInfo ( X509NameType . UpnName , false ) ;
if ( upnName . Length > 0 ) {
sb . AppendLine ( ) ;
sb . Append ( " " ) ;
sb . Append ( "UPN Name: " ) ;
sb . Append ( upnName ) ;
}
string dnsName = GetNameInfo ( X509NameType . DnsName , false ) ;
if ( dnsName . Length > 0 ) {
sb . AppendLine ( ) ;
sb . Append ( " " ) ;
sb . Append ( "DNS Name: " ) ;
sb . Append ( dnsName ) ;
}
// Issuer
sb . AppendLine ( ) ;
sb . AppendLine ( ) ;
sb . AppendLine ( "[Issuer]" ) ;
sb . Append ( " " ) ;
sb . Append ( IssuerName . Name ) ;
simpleName = GetNameInfo ( X509NameType . SimpleName , true ) ;
if ( simpleName . Length > 0 ) {
sb . AppendLine ( ) ;
sb . Append ( " " ) ;
sb . Append ( "Simple Name: " ) ;
sb . Append ( simpleName ) ;
}
emailName = GetNameInfo ( X509NameType . EmailName , true ) ;
if ( emailName . Length > 0 ) {
sb . AppendLine ( ) ;
sb . Append ( " " ) ;
sb . Append ( "Email Name: " ) ;
sb . Append ( emailName ) ;
}
upnName = GetNameInfo ( X509NameType . UpnName , true ) ;
if ( upnName . Length > 0 ) {
sb . AppendLine ( ) ;
sb . Append ( " " ) ;
sb . Append ( "UPN Name: " ) ;
sb . Append ( upnName ) ;
}
dnsName = GetNameInfo ( X509NameType . DnsName , true ) ;
if ( dnsName . Length > 0 ) {
sb . AppendLine ( ) ;
sb . Append ( " " ) ;
sb . Append ( "DNS Name: " ) ;
sb . Append ( dnsName ) ;
}
// Serial Number
sb . AppendLine ( ) ;
sb . AppendLine ( ) ;
sb . AppendLine ( "[Serial Number]" ) ;
sb . Append ( " " ) ;
sb . AppendLine ( SerialNumber ) ;
// NotBefore
sb . AppendLine ( ) ;
sb . AppendLine ( "[Not Before]" ) ;
sb . Append ( " " ) ;
sb . AppendLine ( FormatDate ( NotBefore ) ) ;
// NotAfter
sb . AppendLine ( ) ;
sb . AppendLine ( "[Not After]" ) ;
sb . Append ( " " ) ;
sb . AppendLine ( FormatDate ( NotAfter ) ) ;
// Thumbprint
sb . AppendLine ( ) ;
sb . AppendLine ( "[Thumbprint]" ) ;
sb . Append ( " " ) ;
sb . AppendLine ( Thumbprint ) ;
// Signature Algorithm
sb . AppendLine ( ) ;
sb . AppendLine ( "[Signature Algorithm]" ) ;
sb . Append ( " " ) ;
sb . Append ( SignatureAlgorithm . FriendlyName ) ;
sb . Append ( '(' ) ;
sb . Append ( SignatureAlgorithm . Value ) ;
sb . AppendLine ( ")" ) ;
// Public Key
sb . AppendLine ( ) ;
sb . Append ( "[Public Key]" ) ;
// It could throw if it's some user-defined CryptoServiceProvider
try {
PublicKey pubKey = PublicKey ;
sb . AppendLine ( ) ;
sb . Append ( " " ) ;
sb . Append ( "Algorithm: " ) ;
sb . Append ( pubKey . Oid . FriendlyName ) ;
// So far, we only support RSACryptoServiceProvider & DSACryptoServiceProvider Keys
try {
sb . AppendLine ( ) ;
sb . Append ( " " ) ;
sb . Append ( "Length: " ) ;
using ( RSA pubRsa = this . GetRSAPublicKey ( ) ) {
if ( pubRsa ! = null ) {
sb . Append ( pubRsa . KeySize ) ;
}
}
} catch ( NotSupportedException ) {
}
sb . AppendLine ( ) ;
sb . Append ( " " ) ;
sb . Append ( "Key Blob: " ) ;
sb . AppendLine ( pubKey . EncodedKeyValue . Format ( true ) ) ;
sb . Append ( " " ) ;
sb . Append ( "Parameters: " ) ;
sb . Append ( pubKey . EncodedParameters . Format ( true ) ) ;
} catch ( CryptographicException ) {
}
// Private key
Impl . AppendPrivateKeyInfo ( sb ) ;
// Extensions
X509ExtensionCollection extensions = Extensions ;
if ( extensions . Count > 0 ) {
sb . AppendLine ( ) ;
sb . AppendLine ( ) ;
sb . Append ( "[Extensions]" ) ;
foreach ( X509Extension extension in extensions ) {
try {
sb . AppendLine ( ) ;
sb . Append ( "* " ) ;
sb . Append ( extension . Oid . FriendlyName ) ;
sb . Append ( '(' ) ;
sb . Append ( extension . Oid . Value ) ;
sb . Append ( "):" ) ;
sb . AppendLine ( ) ;
sb . Append ( " " ) ;
sb . Append ( extension . Format ( true ) ) ;
} catch ( CryptographicException ) {
}
}
}
sb . AppendLine ( ) ;
return sb . ToString ( ) ;
2014-08-13 10:39:27 +01:00
}
2019-04-12 14:10:50 +00:00
public override void Import ( byte [ ] rawData )
2014-08-13 10:39:27 +01:00
{
2019-04-12 14:10:50 +00:00
base . Import ( rawData ) ;
2014-08-13 10:39:27 +01:00
}
2019-04-12 14:10:50 +00:00
public override void Import ( byte [ ] rawData , string password , X509KeyStorageFlags keyStorageFlags )
2016-02-22 11:00:01 -05:00
{
2019-04-12 14:10:50 +00:00
base . Import ( rawData , password , keyStorageFlags ) ;
2016-02-22 11:00:01 -05:00
}
2019-04-12 14:10:50 +00:00
[CLSCompliantAttribute (false)]
public override void Import ( byte [ ] rawData , SecureString password , X509KeyStorageFlags keyStorageFlags )
2014-08-13 10:39:27 +01:00
{
2019-04-12 14:10:50 +00:00
base . Import ( rawData , password , keyStorageFlags ) ;
2014-08-13 10:39:27 +01:00
}
2019-04-12 14:10:50 +00:00
public override void Import ( string fileName )
2014-08-13 10:39:27 +01:00
{
2019-04-12 14:10:50 +00:00
base . Import ( fileName ) ;
2014-08-13 10:39:27 +01:00
}
2019-04-12 14:10:50 +00:00
public override void Import ( string fileName , string password , X509KeyStorageFlags keyStorageFlags )
2014-08-13 10:39:27 +01:00
{
2019-04-12 14:10:50 +00:00
base . Import ( fileName , password , keyStorageFlags ) ;
2014-08-13 10:39:27 +01:00
}
2019-04-12 14:10:50 +00:00
[CLSCompliantAttribute (false)]
public override void Import ( string fileName , SecureString password , X509KeyStorageFlags keyStorageFlags )
2014-08-13 10:39:27 +01:00
{
2019-04-12 14:10:50 +00:00
base . Import ( fileName , password , keyStorageFlags ) ;
2014-08-13 10:39:27 +01:00
}
2019-04-12 14:10:50 +00:00
#region Mono Implementation
2014-08-13 10:39:27 +01:00
public bool Verify ( )
{
2016-04-12 13:19:31 -04:00
return Impl . Verify ( this ) ;
2014-08-13 10:39:27 +01:00
}
2019-04-12 14:10:50 +00:00
#endregion
2014-08-13 10:39:27 +01:00
2019-04-12 14:10:50 +00:00
static X509Extension CreateCustomExtensionIfAny ( Oid oid )
2014-08-13 10:39:27 +01:00
{
2019-04-12 14:10:50 +00:00
string oidValue = oid . Value ;
switch ( oidValue ) {
case Oids . BasicConstraints :
return X509Pal . Instance . SupportsLegacyBasicConstraintsExtension ?
new X509BasicConstraintsExtension ( ) :
null ;
2014-08-13 10:39:27 +01:00
2019-04-12 14:10:50 +00:00
case Oids . BasicConstraints2 :
return new X509BasicConstraintsExtension ( ) ;
2014-08-13 10:39:27 +01:00
2019-04-12 14:10:50 +00:00
case Oids . KeyUsage :
return new X509KeyUsageExtension ( ) ;
2014-08-13 10:39:27 +01:00
2019-04-12 14:10:50 +00:00
case Oids . EnhancedKeyUsage :
return new X509EnhancedKeyUsageExtension ( ) ;
case Oids . SubjectKeyIdentifier :
return new X509SubjectKeyIdentifierExtension ( ) ;
2014-08-13 10:39:27 +01:00
2019-04-12 14:10:50 +00:00
default :
return null ;
}
2014-08-13 10:39:27 +01:00
}
2019-04-12 14:10:50 +00:00
//
// MARTIN CHECK POINT
//
2014-08-13 10:39:27 +01:00
2019-04-12 14:10:50 +00:00
new internal X509Certificate2Impl Impl {
2016-04-12 13:19:31 -04:00
get {
2019-04-12 14:10:50 +00:00
var impl2 = base . Impl as X509Certificate2Impl ;
X509Helper . ThrowIfContextInvalid ( impl2 ) ;
return impl2 ;
2016-04-12 13:19:31 -04:00
}
2014-08-13 10:39:27 +01:00
}
}
}