You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
|`ce login`| Sign in via Keycloak device authorization |
40
+
|`ce logout`| Sign out and revoke tokens |
41
+
|`ce whoami`| Show who you're signed in as |
40
42
41
43
### Environments (`ce env`)
42
44
43
45
Environments let you switch between `dev`, `sandbox`, and `prod` without touching env vars. Each environment maps a friendly name to an API URL (plus optional OIDC overrides).
44
46
45
-
| Command | Description |
46
-
|---|---|
47
-
|`ce env list`| List all environments (● marks the active one) |
48
-
|`ce env use <n>`| Switch to a different environment |
|`ce iir challenge sign`| No | Sign a single CE challenge JSON file and produce a Proof JWT |
67
+
|`ce iir challenge bulk-sign`| Yes | Bulk-validate and sign challenges from a CSV |
68
+
|`ce iir issuer-did publish`| Yes | Publish signed issuers to the IIR registry |
59
69
60
-
**Phase 1 — Generate signed challenges:**
70
+
#### Sign a single challenge (`ce iir challenge sign`)
71
+
72
+
Signs a CE-generated challenge JSON file with an Ed25519 private key (alg `EdDSA`) and verifies the resulting JWT against the public key resolved from the DID in the payload. No login required — offline for `did:key`, single HTTPS fetch for `did:web`.
61
73
62
74
```bash
63
-
ce iir bulk-upload-dids sign-challenges --csv input.csv
75
+
ce iir challenge sign \
76
+
--private-key z3u2en... \
77
+
--challenge-file challenge.json \
78
+
--output signed-challenge.jwt
64
79
```
65
80
66
-
Validates each row (membership, registry lookup, DID resolution), creates challenges, signs JWTs with the provided private keys, and writes the results to an output CSV.
|`--challenge-file`| Yes | Path to the challenge JSON produced by CE |
85
+
|`--output`, `-o`| No | Write the JWT to this file. If omitted, the JWT is printed to stdout |
86
+
87
+
The challenge JSON must include `did`, `challenge`, `aud`, `iat`, and `exp`. The `did` field is used as the JWT header `kid` and to resolve the public key for verification (`did:key` resolves offline; `did:web` is fetched over HTTPS using the OS trust store).
88
+
89
+
Example challenge file:
90
+
91
+
```json
92
+
{
93
+
"did": "did:key:z6Mkh...#z6Mkh...",
94
+
"challenge": "abc123-nonce",
95
+
"aud": "https://credentialengine.org/iir",
96
+
"iat": 1779317055,
97
+
"exp": 1779317655
98
+
}
99
+
```
67
100
68
-
**Phase 2 — Publish to the IIR registry:**
101
+
On success, the JWT is written (or printed) and a verification confirmation is shown on stderr:
102
+
103
+
```
104
+
Signature verification: OK (matches DID public key)
105
+
Wrote Proof JWT to: signed-challenge.jwt
106
+
```
107
+
108
+
#### Bulk DID upload
109
+
110
+
Register DIDs for multiple organizations in one go. The process has two phases.
ce iir challenge bulk-sign --csv input.csv --output output.csv
116
+
```
117
+
118
+
Validates each row (membership, registry lookup, DID resolution), creates challenges, signs JWTs with the provided private keys, and writes the results to an output CSV. If `--output` is omitted, defaults to `Output-<stem>-<UTC>.csv`. Failed rows are written to `Errors-<stem>-<UTC>.csv` (override with `--errors`).
119
+
120
+
**Phase 2 — Publish to the IIR registry (`ce iir issuer-did publish`):**
69
121
70
122
```bash
71
-
ce iir bulk-upload-dids publish --output-file Output-input-20240101T000000Z.csv
123
+
ce iir issuer-did publish --input output.csv
72
124
```
73
125
74
-
Verifies the JWT signatures server-side and publishes each issuer to the IIR.
126
+
Verifies the JWT signatures and publishes each issuer to the IIR. Pass `--yes`/`-y` to skip the confirmation prompt. Failed publishes are written to `PublishErrors-<stem>-<UTC>.csv` (override with `--publish-errors`).
75
127
76
128
#### Input CSV format
77
129
78
-
| Column | Required | Description |
79
-
|---|---|---|
80
-
|`CTID`| Yes | The organization's CTID (must be published in the registry) |
81
-
|`DID`| Yes |`did:key:...` or `did:web:...`|
82
-
|`VerificationMethod`| Yes | Full verification method ID (e.g., `did:key:z6Mk...#z6Mk...`) |
83
-
|`Algorithm`| For did:key|`Ed25519`, `secp256k1`, `P-256`, or `X25519`|
84
-
|`PrivateKey`| Yes | Multibase-encoded private key for signing |
85
-
|`ValidFrom`| No | Date when the issuer becomes valid (MM/DD/YYYY) |
86
-
|`ValidUntil`| No | Date when the issuer expires (MM/DD/YYYY) |
0 commit comments