private static bool IsRepositoryCounterSignerInfo(CRYPT_ATTRIBUTE_STRING commitmentTypeIndicationAttribute) { int sizeOfCryptIntegerBlob = MarshalUtility.SizeOf <CRYPT_INTEGER_BLOB>(); for (var i = 0; i < commitmentTypeIndicationAttribute.cValue; ++i) { var attributeValuePointer = new IntPtr( (long)commitmentTypeIndicationAttribute.rgValue + (i * sizeOfCryptIntegerBlob)); var attributeValue = MarshalUtility.PtrToStructure <CRYPT_INTEGER_BLOB>(attributeValuePointer); var bytes = new byte[attributeValue.cbData]; Marshal.Copy(attributeValue.pbData, bytes, startIndex: 0, length: bytes.Length); var commitmentTypeIndication = CommitmentTypeIndication.Read(bytes); if (string.Equals( commitmentTypeIndication.CommitmentTypeId.Value, Oids.CommitmentTypeIdentifierProofOfReceipt, StringComparison.Ordinal)) { return(true); } } return(false); }
/// <summary> /// Create a CommitmentTypeIndication attribute. /// https://tools.ietf.org/html/rfc5126.html#section-5.11.1 /// </summary> /// <param name="type">The signature type.</param> public static CryptographicAttributeObject CreateCommitmentTypeIndication(SignatureType type) { // SignatureType -> Oid var oid = GetSignatureTypeOid(type); var commitmentTypeIndication = CommitmentTypeIndication.Create(new Oid(oid)); var value = new AsnEncodedData(Oids.CommitmentTypeIndication, commitmentTypeIndication.Encode()); return(new CryptographicAttributeObject( new Oid(Oids.CommitmentTypeIndication), new AsnEncodedDataCollection(value))); }
/// <summary> /// Attribute -> SignatureType values with no validation. /// </summary> private static IEnumerable <SignatureType> GetCommitmentTypeIndicationRawValues(CryptographicAttributeObject attribute) { // Most packages should have either 0 or 1 signature types. var values = new List <SignatureType>(capacity: 1); foreach (var value in attribute.Values) { var indication = CommitmentTypeIndication.Read(value.RawData); var signatureType = GetSignatureType(indication.CommitmentTypeId.Value); values.Add(signatureType); } return(values); }