docs: public static Idemix.CredentialRevocationInformation createCRI(PrivateKey key, BIG[] unrevokedHandles, int epoch, RevocationAlgorithm alg) throws CryptoException {
          Idemix.CredentialRevocationInformation.Builder builder = Idemix.CredentialRevocationInformation.newBuilder();
          builder.setRevocationAlg(alg.ordinal());
          builder.setEpoch(epoch);
  
          // Create epoch key
          WeakBB.KeyPair keyPair = WeakBB.weakBBKeyGen();
          if (alg == RevocationAlgorithm.ALG_NO_REVOCATION) {
              // Dummy PK in the proto
              builder.setEpochPk(IdemixUtils.transformToProto(IdemixUtils.genG2));
          } else {
              // Real PK only if we are going to use it
              builder.setEpochPk(IdemixUtils.transformToProto(keyPair.getPk()));
          }
  
          // Sign epoch + epoch key with the long term key
          byte[] signed;
          try {
              Idemix.CredentialRevocationInformation cri = builder.build();
              Signature ecdsa = Signature.getInstance("SHA256withECDSA");
              ecdsa.initSign(key);
              ecdsa.update(cri.toByteArray());
              signed = ecdsa.sign();
  
              builder.setEpochPkSig(ByteString.copyFrom(signed));
          } catch (NoSuchAlgorithmException | SignatureException | InvalidKeyException e) {
              throw new CryptoException("Error processing the signature");
          }
  
          if (alg == RevocationAlgorithm.ALG_NO_REVOCATION) {
              // build and return the credential information object
              return builder.build();
          } else {
              // If alg not supported, return null
              throw new IllegalArgumentException("Algorithm " + alg.name() + " not supported");
          }
      }