GithubHelp home page GithubHelp logo

baha-sk / jws-test-suite Goto Github PK

View Code? Open in Web Editor NEW

This project forked from decentralized-identity/jws-test-suite

0.0 0.0 0.0 3.01 MB

JsonWebSignature2020 Test Suite

Home Page: https://identity.foundation/JWS-Test-Suite

License: Apache License 2.0

Shell 0.09% JavaScript 44.98% Java 12.25% Go 15.62% Rust 17.33% HTML 6.06% Dockerfile 3.65%

jws-test-suite's Introduction

JsonWebSignature2020 & VC JWT Test Suite

CI

See dif-grant-1-jws-test-suite.

The purpose of this test suite is to enable interoperability testing across implementations of https://w3id.org/security/suites/jws-2020.

This suite is used to create verifiable credentials and presentations that conform to the VC Data Model.

This test suite does not currently support VC-JWT, even though some implementations may also support it.

Key Types & Signature Algorithms

As defined in the suite there are a number of supported key types using JsonWebKey2020 and corresponding signature algorithms. The table below illustrates what this test suite supports for testing. Currently, there are four keys used in testing:

kty crv or size signature
OKP Ed25519 EdDSA
EC secp256k1 ES256k
EC secp256r1 / P-256 ES256
EC secp384r1 / P-384 ES384
RSA 2048 PS256

Usage

npm i
npm run build
npm run report:clean
npm run report:generate
npm run report:evaluate

Build an Implementation

docker-compose build transmute

Create a Credential with an Implementation

IMPLEMENTATION=transmute
INPUT=/data/credentials/credential-0.json
KEY=/data/keys/key-0-ed25519.json
OUTPUT=/data/implementations/$IMPLEMENTATION/credential-0--key-0-ed25519.json

docker-compose run $IMPLEMENTATION \
credential create \
--input $INPUT \
--output $OUTPUT \
--key $KEY

Create a Presentation with an Implementation

IMPLEMENTATION=transmute
INPUT=/data/presentations/presentation-0.json
KEY=/data/keys/key-0-ed25519.json
OUTPUT=/data/implementations/$IMPLEMENTATION/presentation-0--key-0-ed25519.json

docker-compose run $IMPLEMENTATION \
presentation create \
--input $INPUT \
--output $OUTPUT \
--key $KEY

Verify a Credential with an Implementation

IMPLEMENTATION=transmute
INPUT=/data/implementations/$IMPLEMENTATION/credential-0--key-0-ed25519.json
OUTPUT=/data/implementations/$IMPLEMENTATION/credential-0--key-0-ed25519.test.verification.json

docker-compose run $IMPLEMENTATION \
credential verify \
--input $INPUT \
--output $OUTPUT

Verify a Presentation with an Implementation

IMPLEMENTATION=transmute
INPUT=/data/implementations/$IMPLEMENTATION/presentation-0--key-0-ed25519.json
OUTPUT=/data/implementations/$IMPLEMENTATION/presentation-0--key-0-ed25519.test.verification.json

docker-compose run $IMPLEMENTATION \
presentation verify \
--input $INPUT \
--output $OUTPUT

Creating an Implementation

Anyone is welcome to submit an implementation. This suite uses docker compose to simplify testing each implementation. A mock implementation is provided here as a reference.

In preparing your submission, you'll need to do the following:

  1. Create a new subdirectory in the implementations directory with your implementation.
  2. Create a new subdirectory in the data/implementations directory for your implementation's output files.
  3. Build your implementation in implementations/{your-impl} along with a working Dockerfile (details on functionality below).
  4. Modify the docker-compose file to list your implementation.

Implementation Details

Your Docker image needs to support the following inputs, styled as a CLI, as called from generate.js. It is not required to support all keys, credentials, or presentations. If your implementation does not support one of the options called during generate it's advised to fail gracefully, and not write an empty output file.

  1. credential create

Generates a credential using your implementation. Takes four arguments:

  • --input $INPUT where $INPUT is a path to an existing credential file such as /data/credentials/credential-0.json
  • --output $OUTPUT where $OUTPUT is a path to a file your implementation will create such as data/implementations/$IMPLEMENTATION/credential-0--key-0-ed25519.json
  • --key $KEY where $KEY is a path to an existing key file such as /data/keys/key-0-ed25519.json
  • --format $FORMAT where $FORMAT is a either vc or vc-jwt
  1. credential verify

Verifies a credential using your implementation. Takes four arguments:

  • --input $INPUT where $INPUT is a path to an existing signed credential file such as /data/implementations/$IMPLEMENTATION/credential-0--key-0-ed25519.json
  • --output $OUTPUT where $OUTPUT is a path to a file your implementation will create such as /data/implementations/$IMPLEMENTATION/credential-0--key-0-ed25519.test.verification.json
  1. presentation create

Generates a presentation using your implementation. Takes four arguments:

  • --input $INPUT where $INPUT is a path to an existing presentation file such as /data/presentations/presentation-0.json
  • --output $OUTPUT where $OUTPUT is a path to a file your implementation will create such as data/implementations/$IMPLEMENTATION/presentation-0--key-0-ed25519.json
  • --key $KEY where $KEY is a path to an existing key file such as /data/keys/key-0-ed25519.json
  • --format $FORMAT where $FORMAT is a either vp or vp-jwt
  1. presentation verify
  • --input $INPUT where $INPUT is a path to an existing signed presentation file such as /data/implementations/$IMPLEMENTATION/presentation-0--key-0-ed25519.json
  • --output $OUTPUT where $OUTPUT is a path to a file your implementation will create such as /data/implementations/$IMPLEMENTATION/presentation-0--key-0-ed25519.test.verification.json

If your implementation supports both the plain (vc, vp) and JWT (vc-jwt, vp-jwt) variations you should diff the output files for each credential and presentation and their verifications. The convention is as follows:

For credentials...

vc: credential-0--key-0-ed25519.vc.json vc-jwt: credential-0--key-0-ed25519.vc-jwt.json

For presentations...

vp: presentation-0--key-0-ed25519.vp.json vp-jwt: presentation-0--key-0-ed25519.vp-jwt.json

Note on JWT Representations

The JWT representations: vc-jwt and vp-jwt do not use the Linked Data signature process described in the JsonWebSignature2020 specification. Instead, for signing and verifying JWT representations, standard JOSE is used. The key type and algorithm specified for signing and verifying are consistent with the JsonWebKey2020 representations found in this test suite.

Generating Your Implementation Files

To simplify generation of your implementation's signed files you can use the command npm run report:generate. If wish to only run your implementation, you can modify the (focusedImplementations value here)[https://github.com/decentralized-identity/JWS-Test-Suite/blob/main/generate.js#L25].

Testing Your Implementation

To test your implementation you can verify the credentials and presentations your implementation generates against other implementations. At present, the transmute implementation is authoritative for all verifications except for credentials signed with RSA-2048 keys using PS256. For RSA credentials and presentations, test against spruce.

The only thing tested by the suite are valid signatures for a given proof type. This means using the proofPurpose of assertionMethod for credentials, and the type of authentication for presentations, where a challenge value must be present.

Example commands can be found above.

jws-test-suite's People

Contributors

clehner avatar decentralgabe avatar hackmd-deploy avatar kimdhamilton avatar nembal avatar or13 avatar peacekeeper avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.