/// <summary> /// Checks whether object attributes match PKCS#11 URI /// </summary> /// <param name="pkcs11Uri">PKCS#11 URI</param> /// <param name="objectAttributes">Object attributes</param> /// <returns>True if object attributes match PKCS#11 URI</returns> public static bool Matches(Pkcs11Uri pkcs11Uri, List <CK_ATTRIBUTE> objectAttributes) { if (pkcs11Uri == null) { throw new ArgumentNullException("pkcs11Uri"); } if (objectAttributes == null) { throw new ArgumentNullException("objectAttributes"); } NativeULong ckaClassType = ConvertUtils.UInt32FromCKA(CKA.CKA_CLASS); CKO? ckaClassValue = null; bool ckaClassFound = false; NativeULong ckaLabelType = ConvertUtils.UInt32FromCKA(CKA.CKA_LABEL); string ckaLabelValue = null; bool ckaLabelFound = false; NativeULong ckaIdType = ConvertUtils.UInt32FromCKA(CKA.CKA_ID); byte[] ckaIdValue = null; bool ckaIdFound = false; foreach (CK_ATTRIBUTE objectAttribute in objectAttributes) { CK_ATTRIBUTE attribute = objectAttribute; if (attribute.type == ckaClassType) { NativeULong nativeUlongValue = 0; CkaUtils.ConvertValue(ref attribute, out nativeUlongValue); ckaClassValue = ConvertUtils.UInt32ToCKO(nativeUlongValue); ckaClassFound = true; } else if (attribute.type == ckaLabelType) { CkaUtils.ConvertValue(ref attribute, out ckaLabelValue); ckaLabelFound = true; } else if (objectAttribute.type == ckaIdType) { CkaUtils.ConvertValue(ref attribute, out ckaIdValue); ckaIdFound = true; } if (ckaClassFound && ckaLabelFound && ckaIdFound) { break; } } if ((!ckaClassFound) && (pkcs11Uri.Type != null)) { throw new Pkcs11UriException("CKA_CLASS attribute is not present in the list of object attributes"); } if ((!ckaLabelFound) && (pkcs11Uri.Object != null)) { throw new Pkcs11UriException("CKA_LABEL attribute is not present in the list of object attributes"); } if ((!ckaIdFound) && (pkcs11Uri.Id != null)) { throw new Pkcs11UriException("CKA_ID attribute is not present in the list of object attributes"); } return(Pkcs11UriSharedUtils.Matches(pkcs11Uri, ckaClassValue, ckaLabelValue, ckaIdValue)); }