Как обновить определенный атрибут после нахождения объекта. Ошибка получения Метод C_SetAttributeValue вернул CKR_ATTRIBUTE_READ_ONLY - PullRequest
1 голос
/ 11 марта 2019

Я пытаюсь обновить атрибут после нахождения объекта.Опробовал разные случаи.

Мой код создания:

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

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

Поведение, которое вы наблюдаете, похоже, специфично для реализации 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.
0 голосов
/ 12 марта 2019

Проверьте, установлено ли для CKA_MODIFIABLE значение TRUE, поскольку этот атрибут указывает, доступен ли объект данных только для чтения или нет. CKA_MODIFIABLE по умолчанию TRUE и может быть изменено только путем копирования объекта.

Также обратите внимание на примечание стандарта PKCS # 11:

атрибуты, которые определяет Cryptoki, могут быть изменены модифицируется на некоторых токенах. То есть, если атрибут Cryptoki описывается как модифицируемый, то на самом деле означает только то, что его можно изменять, если речь идет о спецификации Cryptoki. определенный токен может не поддерживать модификацию некоторых таких атрибутов.

Таким образом, это может быть случай, когда токен не позволяет вам изменить атрибут и что это не проблема из вашего кода.

...