Exemple #1
0
        private static int FindIndexForSigner(SignerInfo[] signerInfos, SignerInfo signer)
        {
            Debug.Assert(signer != null);
            SubjectIdentifier id = signer.SignerIdentifier;

            for (int i = 0; i < signerInfos.Length; i++)
            {
                SignerInfo        current   = signerInfos[i];
                SubjectIdentifier currentId = current.SignerIdentifier;

                if (id.IsEquivalentTo(currentId))
                {
                    return(i);
                }
            }

            return(-1);
        }
Exemple #2
0
        internal SignerInfo(ref SignerInfoAsn parsedData, SignedCms ownerDocument)
        {
            Version                       = parsedData.Version;
            SignerIdentifier              = new SubjectIdentifier(parsedData.Sid);
            _digestAlgorithm              = parsedData.DigestAlgorithm.Algorithm;
            _signedAttributesMemory       = parsedData.SignedAttributes;
            _signatureAlgorithm           = parsedData.SignatureAlgorithm.Algorithm;
            _signatureAlgorithmParameters = parsedData.SignatureAlgorithm.Parameters;
            _signature                    = parsedData.SignatureValue;
            _unsignedAttributes           = parsedData.UnsignedAttributes;

            if (_signedAttributesMemory.HasValue)
            {
                SignedAttributesSet signedSet = SignedAttributesSet.Decode(
                    _signedAttributesMemory.Value,
                    AsnEncodingRules.BER);

                _signedAttributes = signedSet.SignedAttributes;
                Debug.Assert(_signedAttributes != null);
            }

            _document = ownerDocument;
        }
        internal bool IsEquivalentTo(SubjectIdentifier other)
        {
            SubjectIdentifier currentId = other;

            if (currentId.Type != Type)
            {
                return(false);
            }

            X509IssuerSerial issuerSerial = default;

            if (Type == SubjectIdentifierType.IssuerAndSerialNumber)
            {
                issuerSerial = (X509IssuerSerial)Value !;
            }

            switch (Type)
            {
            case SubjectIdentifierType.IssuerAndSerialNumber:
            {
                X509IssuerSerial currentIssuerSerial = (X509IssuerSerial)currentId.Value !;

                return(currentIssuerSerial.IssuerName == issuerSerial.IssuerName &&
                       currentIssuerSerial.SerialNumber == issuerSerial.SerialNumber);
            }

            case SubjectIdentifierType.SubjectKeyIdentifier:
                return((string)Value ! == (string)currentId.Value !);

            case SubjectIdentifierType.NoSignature:
                return(true);

            default:
                Debug.Fail($"No match logic for SubjectIdentifierType {Type}");
                throw new CryptographicException();
            }
        }