![](/img/trans.png)
[英]C# ASP.NET: 'Object reference not set to an instance of an object.' System.Xml.Linq.XElement.Attribute(…) returned null
[英]How to Update particular Attribute after finding an object. getting error Method C_SetAttributeValue returned CKR_ATTRIBUTE_READ_ONLY
我尝试在找到对象后更新属性。 尝试了不同的情况。
我的创建代码:
using (var pkcs11 = new Pkcs11(@"C:\SoftHSM2\lib\softhsm2.dll", AppType.SingleThreaded))
{
var slot = pkcs11.GetSlotList(SlotsType.WithTokenPresent)[0];
using (var session = slot.OpenSession(SessionType.ReadWrite))
{
session.Login(CKU.CKU_USER, "1111");
var objectAttributes = new List<ObjectAttribute>
{
new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_DATA),
new ObjectAttribute(CKA.CKA_TOKEN, true),
new ObjectAttribute(CKA.CKA_MODIFIABLE, true),
new ObjectAttribute(CKA.CKA_APPLICATION, txtTypeofData.Text),
new ObjectAttribute(CKA.CKA_LABEL,txtMsisdn.Text),
new ObjectAttribute(CKA.CKA_VALUE, "Data object content original " + DateTime.Now)
};
var result = session.CreateObject(objectAttributes);
session.Logout();
}
}
我的修改代码是:
using (Pkcs11 pkcs11 = new Pkcs11(@"C:\SoftHSM2\lib\softhsm2.dll", AppType.MultiThreaded))
{
var slot = pkcs11.GetSlotList(SlotsType.WithTokenPresent)[0];
using (Session session = slot.OpenSession(SessionType.ReadWrite))
{
session.Login(CKU.CKU_USER, "1111");
List<ObjectAttribute> objectAttributes = new List<ObjectAttribute>();
objectAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_DATA));
objectAttributes.Add(new ObjectAttribute(CKA.CKA_TOKEN, true));
objectAttributes.Add(new ObjectAttribute(CKA.CKA_APPLICATION, txtTypeofData.Text));
objectAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, txtMsisdn.Text));
objectAttributes.Add(new ObjectAttribute(CKA.CKA_MODIFIABLE, true));
var findA = session.FindAllObjects(objectAttributes);
if(findA != null && findA.Count > 0)
{
List<ObjectAttribute> objectAttributesNew = new List<ObjectAttribute>();
objectAttributesNew.Add(new ObjectAttribute(CKA.CKA_VALUE, "Data object content two changed " + DateTime.Now));
session.SetAttributeValue(findA[0], objectAttributesNew);
}
session.Logout();
}
}
您观察到的行为似乎是特定于SoftHSM实现的。 您可以在其源代码中找到以下注释 :
// NOTE: There is no mention in the PKCS#11 v2.40 spec that for a Data
// Object the CKA_VALUE attribute may be modified after creation!
// Therefore we assume it is not allowed to change the CKA_VALUE
// attribute of a Data Object.
检查CKA_MODIFIABLE是否设置为TRUE,因为此属性指示数据对象是否为只读。 CKA_MODIFIABLE默认情况下为TRUE,并且只能通过复制对象进行更改。
另外,请注意PKCS#11标准中的此注释:
Cryptoki指定的可修改属性实际上可能在某些令牌上不可修改。 也就是说,如果将Cryptoki属性描述为可修改的,那实际上仅意味着就Cryptoki规范而言,它是可修改的。 特定令牌可能实际上不支持对某些此类属性的修改。
因此,可能是令牌不允许您更改属性,并且代码中没有问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.