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