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); }
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(); } }