hyperledger-archives / ursa

Hyperledger Ursa (a shared cryptographic library) has moved to end-of-life status, with the components of Ursa still in use moved to their relevant Hyperledger projects (AnonCreds, Indy, Aries and Iroha).

Home Page:https://wiki.hyperledger.org/display/ursa

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

About the generation witness for multiple credentials

xvllinihao opened this issue · comments

#Hi there! I am a newbie in Rust and Ursa. Now I am trying to test the revocation part of ursa. I have some trouble issuing multiple credentials. I want to issue two credentials and watch their witness. But I find that the second witness is always generated wrong.

I use 'ursa::cl::mod::Witness::new()' to generate new witness. I checked its source code and find some possible issues.

    let mut issued = if issuance_by_default {
        (1..=max_cred_num)
            .filter(|idx| !rev_reg_delta.revoked.contains(idx))
            .collect::<BTreeSet<u32>>()
    } else {
        BTreeSet::from_iter(rev_reg_delta.issued.iter().cloned())
    };

    issued.remove(&rev_idx);
    for j in issued.iter() {
        let index = max_cred_num + 1 - j + rev_idx;
        rev_tails_accessor.access_tail(index, &mut |tail| {
            omega = omega.add(tail).unwrap();
        })?;
    }

This is the code from 'ursa::cl::mod::Witness::new()' line 693 to line 707. To generate a new witness, we should use all issued credentials ' tails. However, I find that 'rev_reg_delta.issued' only contains the recently issused credential.

    let rev_reg_delta = if issuance_by_default {
        None
    } else {
        let prev_acc = rev_reg.accum;

        rev_tails_accessor.access_tail(index, &mut |tail| {
            rev_reg.accum = rev_reg.accum.add(tail).unwrap();
        })?;

        Some(RevocationRegistryDelta {
            prev_accum: Some(prev_acc),
            accum: rev_reg.accum,
            issued: hashset![rev_idx],
            revoked: HashSet::new(),
        })
    };

This is the code from 'ursa::cl::issuer::Issuer::_new_non_revocation_credential' line 1376-line 1393. The new generated revocation registry delta only contains one issued credential.
image
And here is a screenshot about my output, I issued two credentials (0,1), but the second revocation registry delta only contains one issued credential (1).

So every time I call the function 'Witness::new()', I get the same witness value:

' Witness { omega: PointG2 { point: 1 0000000000000000000000000000000000000000000000000000000000000000 1 0000000000000000000000000000000000000000000000000000000000000000 2 095E45DDF417D05FB10933FFC63D474548B7FFFF7888802F07FFFFFF7D07A8A8 1 0000000000000000000000000000000000000000000000000000000000000000 1 0000000000000000000000000000000000000000000000000000000000000000 1 0000000000000000000000000000000000000000000000000000000000000000 } } '

How can I fix this problem? Can you help me? And If I am wrong, please tell me. Many thanks in advance!

In short, I find that the issued set in revocation registry delta is not the current set of non-revoked indices V. Do I need to create V myself or ursa already provides the API?