/// <summary> /// Gets the signature type from one or more commitment-type-indication attributes. /// </summary> /// <param name="signedAttributes">A <see cref="SignerInfo" /> signed attributes collection.</param> /// <remarks>Unknown OIDs are ignored.</remarks> /// <exception cref="ArgumentNullException">Thrown if <paramref name="signedAttributes" /> is <c>null</c>.</exception> /// <exception cref="SignatureException">Thrown if one or more attributes are invalid.</exception> public static SignatureType GetSignatureType(CryptographicAttributeObjectCollection signedAttributes) { if (signedAttributes == null) { throw new ArgumentNullException(nameof(signedAttributes)); } var values = signedAttributes.GetAttributes(Oids.CommitmentTypeIndication) .SelectMany(attribute => GetCommitmentTypeIndicationRawValues(attribute)) .Distinct(); // Remove unknown values, these could be future values. var knownValues = values.Where(e => e != SignatureType.Unknown).ToList(); if (knownValues.Count == 0) { return(SignatureType.Unknown); } // Author and repository values are mutually exclusive in the same signature. // If multiple distinct known values exist then the attribute is invalid. if (knownValues.Count > 1) { throw new SignatureException(Strings.CommitmentTypeIndicationAttributeInvalidCombination); } return(knownValues[0]); }
/// <summary> /// Gets 0 or 1 attribute with the specified OID. If more than one attribute is found, an exception is thrown. /// </summary> /// <param name="attributes">A collection of attributes.</param> /// <param name="oid">The attribute OID to search for.</param> /// <returns>Either a <see cref="CryptographicAttributeObject" /> or <c>null</c>, if no attribute was found.</returns> /// <exception cref="ArgumentNullException">Thrown if <paramref name="attributes" /> is <c>null</c>.</exception> /// <exception cref="ArgumentException">Thrown if <paramref name="oid" /> is either <c>null</c> or an empty string.</exception> /// <exception cref="CryptographicException">Thrown if multiple attribute instances with the specified OID were found.</exception> public static CryptographicAttributeObject GetAttribute(this CryptographicAttributeObjectCollection attributes, string oid) { if (attributes == null) { throw new ArgumentNullException(nameof(attributes)); } if (string.IsNullOrEmpty(oid)) { throw new ArgumentException(Strings.ArgumentCannotBeNullOrEmpty, nameof(oid)); } var matches = attributes.GetAttributes(oid); var instanceCount = matches.Count(); if (instanceCount == 0) { return(null); } if (instanceCount > 1) { throw new CryptographicException(string.Format(CultureInfo.CurrentCulture, Strings.MultipleAttributesDisallowed, oid)); } return(matches.Single()); }