@tinycloud/sdk-core 3.0.0-beta.1 → 3.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{credential-admission-C_cO1QqB.d.cts → credential-admission-BVUC6kdw.d.cts} +67 -2
- package/dist/{credential-admission-cvHe-HUC.d.ts → credential-admission-BgvwOTIV.d.ts} +67 -2
- package/dist/delegations/index.cjs +11 -2
- package/dist/delegations/index.cjs.map +1 -1
- package/dist/delegations/index.js +11 -2
- package/dist/delegations/index.js.map +1 -1
- package/dist/index.cjs +178 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.js +178 -3
- package/dist/index.js.map +1 -1
- package/dist/policy/index.cjs +166 -3
- package/dist/policy/index.cjs.map +1 -1
- package/dist/policy/index.d.cts +2 -2
- package/dist/policy/index.d.ts +2 -2
- package/dist/policy/index.js +166 -3
- package/dist/policy/index.js.map +1 -1
- package/package.json +3 -3
package/dist/policy/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { P as PolicyEngineRecord, S as SignedObjectSigner, a as Policy, U as UnsignedPolicyEngineRecord } from '../credential-admission-
|
|
2
|
-
export { A as ATTESTED_ENFORCER_BINDING_V2_SCHEMA, b as AdmitPolicyCredentialV3Input, B as BuildPolicyCredentialPresentationV3Input, C as CONTENT_SOURCE_V1_DOMAIN,
|
|
1
|
+
import { P as PolicyEngineRecord, S as SignedObjectSigner, a as Policy, U as UnsignedPolicyEngineRecord } from '../credential-admission-BVUC6kdw.cjs';
|
|
2
|
+
export { A as ATTESTED_ENFORCER_BINDING_V2_SCHEMA, b as AdmitPolicyCredentialV3Input, c as AdmitPolicyCredentialV4Input, B as BuildPolicyCredentialPresentationV3Input, d as BuildPolicyCredentialPresentationV4Input, C as CONTENT_SOURCE_V1_DOMAIN, e as CompactPolicyInvocationInput, f as CompactUcanAuthorizationV1, E as ED25519_JCS_SIGNATURE_SUITE, g as EIP191_JCS_SIGNATURE_SUITE, J as JsonObject, L as LAST_V2_CREATE_AT, h as LAST_V2_READ_AT, M as MAX_LEGACY_ENVELOPE_EXPIRES_AT, N as NATIVE_PROJECTION_V1_DOMAIN, i as POLICY_CAPABILITY_V1_DOMAIN, j as POLICY_CAPABILITY_V1_SCHEMA, k as POLICY_CREDENTIAL_REQUIREMENT_V1_TYPE, l as POLICY_ENFORCEMENT_DELEGATION_V2_SCHEMA, m as POLICY_ENGINE_RECORD_SCHEMA, n as POLICY_PRESENTATION_V3_DOMAIN, o as POLICY_PRESENTATION_V3_SCHEMA, p as POLICY_PRESENTATION_V4_DOMAIN, q as POLICY_PRESENTATION_V4_SCHEMA, r as POLICY_SCHEMA, s as POLICY_SESSION_UCAN_V1_PROFILE, t as POLICY_STATUS_SCHEMA, u as POLICY_V1_DOMAIN, v as POLICY_V1_SCHEMA, w as POLICY_V2_DOMAIN, x as POLICY_V2_SCHEMA, y as PolicyChallengeV3, z as PolicyCredentialAdmissionV3, D as PolicyCredentialAdmissionV4, F as PolicyCredentialPresentationV3, G as PolicyCredentialPresentationV4, H as PolicyCredentialRequirementV1, I as PolicyRootStatusV3, K as PolicySessionUcanFactV1, O as PolicySessionUcanV1, Q as PolicyStatus, R as ROOT_REVOCATION_V1_DOMAIN, T as ROOT_REVOCATION_V1_SCHEMA, V as ROOT_STATUS_CHECKPOINT_V1_SCHEMA, W as ROOT_STATUS_RENEWAL_V1_DOMAIN, X as ROOT_STATUS_V1_DOMAIN, Y as SignCompactUcanAuthorizationInput, Z as SignCompactUcanRootAuthorizationInput, _ as SignatureMaterialError, $ as SignatureSuite, a0 as SignatureVerificationError, a1 as SignedObjectCanonicalizationError, a2 as SignedObjectDigestError, a3 as SignedObjectErrorCode, a4 as SignedObjectIdError, a5 as SignedObjectKind, a6 as SignedObjectMaterial, a7 as SignedObjectProfileError, a8 as SignedObjectSchemaError, a9 as SignedObjectSignature, aa as SignedObjectVerificationResult, ab as SignedPolicyObject, ac as SigningKeyBindingError, ad as UnifiedContentSource, ae as UnifiedEncryptionCapability, af as UnifiedKvCapability, ag as UnifiedNativeCapability, ah as UnifiedPolicyCapability, ai as UnifiedPolicyV1, aj as UnifiedPolicyV2, ak as UnifiedResourceSelector, al as UnsignedPolicy, am as UnsignedPolicyCredentialPresentationV4, an as UnsignedPolicyObject, ao as UnsignedPolicyStatus, ap as UnsignedUnifiedPolicyV2, aq as UnsupportedSignatureSuiteError, ar as admitPolicyCredentialV3, as as admitPolicyCredentialV4, at as buildPolicyCredentialPresentationV3, au as buildPolicyCredentialPresentationV4, av as canonicalizeSignedObjectUnsigned, aw as canonicalizeUnifiedPolicyCapability, ax as compactAttenuationContains, ay as contentSourceDigestHex, az as createAndSignPolicy, aA as createAndSignPolicyEngineRecord, aB as createAndSignPolicyStatus, aC as createAndSignSignedObject, aD as createCompactPolicyDescendant, aE as createCompactPolicyInvocation, aF as deriveSignedObjectMaterial, aG as getPolicyRootStatusV3, aH as issuedCredentialEnvelopeFromVerified, aI as mintPolicySessionV3, aJ as normalizeUnifiedPolicyCapability, aK as parseCompactUcanAuthorization, aL as parsePolicySessionUcan, aM as policyCidFromCanonicalBytes, aN as policyDigestHex, aO as policyIdForDigestHex, aP as policyV2DigestHex, aQ as projectUnifiedPolicyCapabilities, aR as projectUnifiedPolicyCapability, aS as renewPolicyRootStatusV3, aT as requestPolicyChallengeV3, aU as revokePolicyRootV3, aV as signCompactUcanAuthorization, aW as signCompactUcanRootAuthorization, aX as signPolicyCredentialPresentationV4, aY as signedObjectIdFor, aZ as toSignedObjectError, a_ as unifiedNativeProjectionHashHex, a$ as unifiedPolicyCapabilityContains, b0 as unifiedPolicyCapabilityDigestHex, b1 as unifiedPolicyCapabilityFromNative, b2 as validatePolicyCredentialRequirementV1, b3 as validatePolicyEngineRecordSigned, b4 as validatePolicyEngineRecordSignedShape, b5 as validatePolicyEngineRecordUnsigned, b6 as validatePolicySigned, b7 as validatePolicySignedShape, b8 as validatePolicyStatusSigned, b9 as validatePolicyStatusSignedShape, ba as validatePolicyStatusUnsigned, bb as validatePolicyUnsigned, bc as validateUnifiedPolicyV2, bd as verifyPolicy, be as verifyPolicyEngineRecord, bf as verifyPolicyRootRevocationV3, bg as verifyPolicyRootStatusCheckpointV3, bh as verifyPolicyStatus, bi as verifySignedObject } from '../credential-admission-BVUC6kdw.cjs';
|
|
3
3
|
import { J as JsonObject, P as PolicyCapabilityError } from '../capability-BjzXwtNw.cjs';
|
|
4
4
|
export { a as JsonValue, b as PolicyCapability, c as PolicyCapabilityErrorCode, d as canonicalizePolicyCapability, j as jcsCanonicalize, n as normalizeJson, e as normalizePolicyCapability, p as policyCapabilityContains, f as policyCapabilityDigestHex, s as serializeJcsJson } from '../capability-BjzXwtNw.cjs';
|
|
5
5
|
import 'zod';
|
package/dist/policy/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { P as PolicyEngineRecord, S as SignedObjectSigner, a as Policy, U as UnsignedPolicyEngineRecord } from '../credential-admission-
|
|
2
|
-
export { A as ATTESTED_ENFORCER_BINDING_V2_SCHEMA, b as AdmitPolicyCredentialV3Input, B as BuildPolicyCredentialPresentationV3Input, C as CONTENT_SOURCE_V1_DOMAIN,
|
|
1
|
+
import { P as PolicyEngineRecord, S as SignedObjectSigner, a as Policy, U as UnsignedPolicyEngineRecord } from '../credential-admission-BgvwOTIV.js';
|
|
2
|
+
export { A as ATTESTED_ENFORCER_BINDING_V2_SCHEMA, b as AdmitPolicyCredentialV3Input, c as AdmitPolicyCredentialV4Input, B as BuildPolicyCredentialPresentationV3Input, d as BuildPolicyCredentialPresentationV4Input, C as CONTENT_SOURCE_V1_DOMAIN, e as CompactPolicyInvocationInput, f as CompactUcanAuthorizationV1, E as ED25519_JCS_SIGNATURE_SUITE, g as EIP191_JCS_SIGNATURE_SUITE, J as JsonObject, L as LAST_V2_CREATE_AT, h as LAST_V2_READ_AT, M as MAX_LEGACY_ENVELOPE_EXPIRES_AT, N as NATIVE_PROJECTION_V1_DOMAIN, i as POLICY_CAPABILITY_V1_DOMAIN, j as POLICY_CAPABILITY_V1_SCHEMA, k as POLICY_CREDENTIAL_REQUIREMENT_V1_TYPE, l as POLICY_ENFORCEMENT_DELEGATION_V2_SCHEMA, m as POLICY_ENGINE_RECORD_SCHEMA, n as POLICY_PRESENTATION_V3_DOMAIN, o as POLICY_PRESENTATION_V3_SCHEMA, p as POLICY_PRESENTATION_V4_DOMAIN, q as POLICY_PRESENTATION_V4_SCHEMA, r as POLICY_SCHEMA, s as POLICY_SESSION_UCAN_V1_PROFILE, t as POLICY_STATUS_SCHEMA, u as POLICY_V1_DOMAIN, v as POLICY_V1_SCHEMA, w as POLICY_V2_DOMAIN, x as POLICY_V2_SCHEMA, y as PolicyChallengeV3, z as PolicyCredentialAdmissionV3, D as PolicyCredentialAdmissionV4, F as PolicyCredentialPresentationV3, G as PolicyCredentialPresentationV4, H as PolicyCredentialRequirementV1, I as PolicyRootStatusV3, K as PolicySessionUcanFactV1, O as PolicySessionUcanV1, Q as PolicyStatus, R as ROOT_REVOCATION_V1_DOMAIN, T as ROOT_REVOCATION_V1_SCHEMA, V as ROOT_STATUS_CHECKPOINT_V1_SCHEMA, W as ROOT_STATUS_RENEWAL_V1_DOMAIN, X as ROOT_STATUS_V1_DOMAIN, Y as SignCompactUcanAuthorizationInput, Z as SignCompactUcanRootAuthorizationInput, _ as SignatureMaterialError, $ as SignatureSuite, a0 as SignatureVerificationError, a1 as SignedObjectCanonicalizationError, a2 as SignedObjectDigestError, a3 as SignedObjectErrorCode, a4 as SignedObjectIdError, a5 as SignedObjectKind, a6 as SignedObjectMaterial, a7 as SignedObjectProfileError, a8 as SignedObjectSchemaError, a9 as SignedObjectSignature, aa as SignedObjectVerificationResult, ab as SignedPolicyObject, ac as SigningKeyBindingError, ad as UnifiedContentSource, ae as UnifiedEncryptionCapability, af as UnifiedKvCapability, ag as UnifiedNativeCapability, ah as UnifiedPolicyCapability, ai as UnifiedPolicyV1, aj as UnifiedPolicyV2, ak as UnifiedResourceSelector, al as UnsignedPolicy, am as UnsignedPolicyCredentialPresentationV4, an as UnsignedPolicyObject, ao as UnsignedPolicyStatus, ap as UnsignedUnifiedPolicyV2, aq as UnsupportedSignatureSuiteError, ar as admitPolicyCredentialV3, as as admitPolicyCredentialV4, at as buildPolicyCredentialPresentationV3, au as buildPolicyCredentialPresentationV4, av as canonicalizeSignedObjectUnsigned, aw as canonicalizeUnifiedPolicyCapability, ax as compactAttenuationContains, ay as contentSourceDigestHex, az as createAndSignPolicy, aA as createAndSignPolicyEngineRecord, aB as createAndSignPolicyStatus, aC as createAndSignSignedObject, aD as createCompactPolicyDescendant, aE as createCompactPolicyInvocation, aF as deriveSignedObjectMaterial, aG as getPolicyRootStatusV3, aH as issuedCredentialEnvelopeFromVerified, aI as mintPolicySessionV3, aJ as normalizeUnifiedPolicyCapability, aK as parseCompactUcanAuthorization, aL as parsePolicySessionUcan, aM as policyCidFromCanonicalBytes, aN as policyDigestHex, aO as policyIdForDigestHex, aP as policyV2DigestHex, aQ as projectUnifiedPolicyCapabilities, aR as projectUnifiedPolicyCapability, aS as renewPolicyRootStatusV3, aT as requestPolicyChallengeV3, aU as revokePolicyRootV3, aV as signCompactUcanAuthorization, aW as signCompactUcanRootAuthorization, aX as signPolicyCredentialPresentationV4, aY as signedObjectIdFor, aZ as toSignedObjectError, a_ as unifiedNativeProjectionHashHex, a$ as unifiedPolicyCapabilityContains, b0 as unifiedPolicyCapabilityDigestHex, b1 as unifiedPolicyCapabilityFromNative, b2 as validatePolicyCredentialRequirementV1, b3 as validatePolicyEngineRecordSigned, b4 as validatePolicyEngineRecordSignedShape, b5 as validatePolicyEngineRecordUnsigned, b6 as validatePolicySigned, b7 as validatePolicySignedShape, b8 as validatePolicyStatusSigned, b9 as validatePolicyStatusSignedShape, ba as validatePolicyStatusUnsigned, bb as validatePolicyUnsigned, bc as validateUnifiedPolicyV2, bd as verifyPolicy, be as verifyPolicyEngineRecord, bf as verifyPolicyRootRevocationV3, bg as verifyPolicyRootStatusCheckpointV3, bh as verifyPolicyStatus, bi as verifySignedObject } from '../credential-admission-BgvwOTIV.js';
|
|
3
3
|
import { J as JsonObject, P as PolicyCapabilityError } from '../capability-BjzXwtNw.js';
|
|
4
4
|
export { a as JsonValue, b as PolicyCapability, c as PolicyCapabilityErrorCode, d as canonicalizePolicyCapability, j as jcsCanonicalize, n as normalizeJson, e as normalizePolicyCapability, p as policyCapabilityContains, f as policyCapabilityDigestHex, s as serializeJcsJson } from '../capability-BjzXwtNw.js';
|
|
5
5
|
import 'zod';
|
package/dist/policy/index.js
CHANGED
|
@@ -3213,6 +3213,7 @@ async function requestPolicyChallengeV3(input) {
|
|
|
3213
3213
|
const response = await fetchFn(new URL("/share/v3/policy/challenges", input.nodeOrigin), {
|
|
3214
3214
|
method: "POST",
|
|
3215
3215
|
redirect: "error",
|
|
3216
|
+
signal: input.signal,
|
|
3216
3217
|
headers: { accept: "application/json", "content-type": "application/json" },
|
|
3217
3218
|
body: JSON.stringify({ policyCid: input.policyCid, recipientDid: input.recipientDid, requestedCapabilities: input.requestedCapabilities.map(normalizeUnifiedPolicyCapability) })
|
|
3218
3219
|
});
|
|
@@ -3230,6 +3231,7 @@ async function mintPolicySessionV3(input) {
|
|
|
3230
3231
|
const response = await fetchFn(new URL("/share/v3/policy/delegations", input.nodeOrigin), {
|
|
3231
3232
|
method: "POST",
|
|
3232
3233
|
redirect: "error",
|
|
3234
|
+
signal: input.signal,
|
|
3233
3235
|
headers: { accept: "application/json", "content-type": "application/json" },
|
|
3234
3236
|
body: JSON.stringify({ policyCid: input.policyCid, challengeId: challenge.challengeId, nonce: challenge.nonce, claim: input.claim, presentation: input.presentation })
|
|
3235
3237
|
});
|
|
@@ -3403,6 +3405,11 @@ var POLICY_SESSION_FACT_KEYS = [
|
|
|
3403
3405
|
"issuanceAuditDigestHex",
|
|
3404
3406
|
"remainingRedelegationDepth"
|
|
3405
3407
|
];
|
|
3408
|
+
var POLICY_SESSION_V4_AUDIT_FACT_KEYS = [
|
|
3409
|
+
"credentialIdAuditDigestHex",
|
|
3410
|
+
"presentationJtiAuditDigestHex"
|
|
3411
|
+
];
|
|
3412
|
+
var LOWER_SHA256_HEX = /^[0-9a-f]{64}$/;
|
|
3406
3413
|
var KV_ACTIONS = /* @__PURE__ */ new Set([
|
|
3407
3414
|
"tinycloud.kv/get",
|
|
3408
3415
|
"tinycloud.kv/list",
|
|
@@ -3795,9 +3802,13 @@ function parsePolicySessionUcan(authorization, expectedProofs) {
|
|
|
3795
3802
|
if (expectedProofs !== void 0 && (parsed.payload.prf[0] !== expectedProofs[0] || parsed.payload.prf[1] !== expectedProofs[1]))
|
|
3796
3803
|
throw new Error("policy session UCAN ordered proofs do not match");
|
|
3797
3804
|
const factKeys = Object.keys(fact);
|
|
3798
|
-
|
|
3805
|
+
const hasLegacyFactShape = factKeys.length === POLICY_SESSION_FACT_KEYS.length && factKeys.every((key) => POLICY_SESSION_FACT_KEYS.includes(key)) && POLICY_SESSION_FACT_KEYS.every((key) => key in fact);
|
|
3806
|
+
const hasV4AuditFactShape = factKeys.length === POLICY_SESSION_FACT_KEYS.length + POLICY_SESSION_V4_AUDIT_FACT_KEYS.length && factKeys.every((key) => POLICY_SESSION_FACT_KEYS.includes(key) || POLICY_SESSION_V4_AUDIT_FACT_KEYS.includes(key)) && POLICY_SESSION_FACT_KEYS.every((key) => key in fact) && POLICY_SESSION_V4_AUDIT_FACT_KEYS.every((key) => key in fact);
|
|
3807
|
+
if (!hasLegacyFactShape && !hasV4AuditFactShape)
|
|
3799
3808
|
throw new Error("policy session UCAN fact is incomplete");
|
|
3800
|
-
if (
|
|
3809
|
+
if (hasV4AuditFactShape && (!LOWER_SHA256_HEX.test(fact.credentialIdAuditDigestHex) || !LOWER_SHA256_HEX.test(fact.presentationJtiAuditDigestHex)))
|
|
3810
|
+
throw new Error("policy session UCAN v4 audit facts are invalid");
|
|
3811
|
+
if (fact.profile !== POLICY_SESSION_UCAN_V1_PROFILE || typeof fact.remainingRedelegationDepth !== "number" || !Number.isInteger(fact.remainingRedelegationDepth) || fact.remainingRedelegationDepth < 0 || fact.remainingRedelegationDepth > 8 || parsed.payload.exp - parsed.payload.nbf > 60 || parsed.payload.iss.split("#", 1)[0] !== fact.nodeAudience || parsed.payload.aud !== fact.recipientDid)
|
|
3801
3812
|
throw new Error("policy session UCAN fact is invalid");
|
|
3802
3813
|
return {
|
|
3803
3814
|
authorization,
|
|
@@ -3925,6 +3936,8 @@ var POLICY_V2_DOMAIN = "xyz.tinycloud.policy/policy/v2\0";
|
|
|
3925
3936
|
var POLICY_CREDENTIAL_REQUIREMENT_V1_TYPE = "TinyCloudPolicyCredentialRequirement";
|
|
3926
3937
|
var POLICY_PRESENTATION_V3_SCHEMA = "xyz.tinycloud.policy/presentation/v3";
|
|
3927
3938
|
var POLICY_PRESENTATION_V3_DOMAIN = "xyz.tinycloud.policy/Presentation/v3\0";
|
|
3939
|
+
var POLICY_PRESENTATION_V4_SCHEMA = "xyz.tinycloud.policy/presentation/v4";
|
|
3940
|
+
var POLICY_PRESENTATION_V4_DOMAIN = "xyz.tinycloud.policy/Presentation/v4\0";
|
|
3928
3941
|
function record(value, label) {
|
|
3929
3942
|
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
3930
3943
|
throw new Error(`${label} must be an object`);
|
|
@@ -4099,6 +4112,97 @@ function envelopeFromVerified(verified) {
|
|
|
4099
4112
|
} = verified;
|
|
4100
4113
|
return envelope;
|
|
4101
4114
|
}
|
|
4115
|
+
function issuedCredentialEnvelopeFromVerified(verified) {
|
|
4116
|
+
return envelopeFromVerified(verified);
|
|
4117
|
+
}
|
|
4118
|
+
async function signPolicyCredentialPresentationV4(value, sign) {
|
|
4119
|
+
const item = record(value, "Policy presentation v4");
|
|
4120
|
+
exactKeys2(item, [
|
|
4121
|
+
"schema",
|
|
4122
|
+
"jti",
|
|
4123
|
+
"challengeId",
|
|
4124
|
+
"nonce",
|
|
4125
|
+
"policyCid",
|
|
4126
|
+
"nodeAudience",
|
|
4127
|
+
"holderDid",
|
|
4128
|
+
"subjectDid",
|
|
4129
|
+
"credentialDigest",
|
|
4130
|
+
"requirementDigest",
|
|
4131
|
+
"descriptorDigest",
|
|
4132
|
+
"requestedCapabilities",
|
|
4133
|
+
"issuedAt",
|
|
4134
|
+
"expiresAt"
|
|
4135
|
+
], "Policy presentation v4");
|
|
4136
|
+
if (item.schema !== POLICY_PRESENTATION_V4_SCHEMA || item.holderDid !== item.subjectDid || !Array.isArray(item.requestedCapabilities)) throw new Error("Policy presentation v4 is invalid");
|
|
4137
|
+
const holderDid = nonEmpty(item.holderDid, "Policy presentation v4 holder DID");
|
|
4138
|
+
didKeyBytes(holderDid);
|
|
4139
|
+
const unsigned = Object.freeze({
|
|
4140
|
+
schema: POLICY_PRESENTATION_V4_SCHEMA,
|
|
4141
|
+
jti: nonEmpty(item.jti, "Policy presentation v4 jti"),
|
|
4142
|
+
challengeId: nonEmpty(item.challengeId, "Policy presentation v4 challenge"),
|
|
4143
|
+
nonce: nonEmpty(item.nonce, "Policy presentation v4 nonce"),
|
|
4144
|
+
policyCid: nonEmpty(item.policyCid, "Policy presentation v4 policy CID"),
|
|
4145
|
+
nodeAudience: nonEmpty(item.nodeAudience, "Policy presentation v4 audience"),
|
|
4146
|
+
holderDid,
|
|
4147
|
+
subjectDid: holderDid,
|
|
4148
|
+
credentialDigest: nonEmpty(item.credentialDigest, "Policy presentation v4 credential digest"),
|
|
4149
|
+
requirementDigest: nonEmpty(item.requirementDigest, "Policy presentation v4 requirement digest"),
|
|
4150
|
+
descriptorDigest: nonEmpty(item.descriptorDigest, "Policy presentation v4 descriptor digest"),
|
|
4151
|
+
// The low-level signer preserves the frozen wire bytes exactly. The
|
|
4152
|
+
// policy-aware builder performs capability normalization and containment.
|
|
4153
|
+
requestedCapabilities: Object.freeze(item.requestedCapabilities),
|
|
4154
|
+
issuedAt: date(item.issuedAt, "Policy presentation v4 issuedAt"),
|
|
4155
|
+
expiresAt: date(item.expiresAt, "Policy presentation v4 expiresAt")
|
|
4156
|
+
});
|
|
4157
|
+
const digest2 = sha2565(new TextEncoder().encode(
|
|
4158
|
+
POLICY_PRESENTATION_V4_DOMAIN + jcsCanonicalize(unsigned)
|
|
4159
|
+
));
|
|
4160
|
+
const signature = await sign(digest2);
|
|
4161
|
+
if (signature.length !== 64 || !ed255193.verify(signature, digest2, didKeyBytes(holderDid))) throw new Error("policy presentation signature is invalid");
|
|
4162
|
+
return Object.freeze({
|
|
4163
|
+
...unsigned,
|
|
4164
|
+
signature: Object.freeze({
|
|
4165
|
+
suite: "Ed25519",
|
|
4166
|
+
signerDid: holderDid,
|
|
4167
|
+
value: encodeBase64Url2(signature)
|
|
4168
|
+
})
|
|
4169
|
+
});
|
|
4170
|
+
}
|
|
4171
|
+
async function buildPolicyCredentialPresentationV4(input) {
|
|
4172
|
+
const policy = validateUnifiedPolicyV2(input.policy, input.policyCid);
|
|
4173
|
+
const requirement = validateCredentialRequirement(input.requirement);
|
|
4174
|
+
const commitment = policy.credentialRequirement;
|
|
4175
|
+
const requirementDigest = await credentialRequirementDigest(requirement);
|
|
4176
|
+
const credentialDigest = await sha256Base64Url(input.credential.credential);
|
|
4177
|
+
if (requirementDigest !== commitment.requirementDigest || input.credential.descriptorDigest !== commitment.descriptorDigest || input.credential.credentialDigest !== credentialDigest || input.credential.issuerDid !== commitment.issuerDid || input.credential.issuerKid !== commitment.issuerKid || jcsCanonicalize(input.credential.profile) !== jcsCanonicalize(commitment.profile) || jcsCanonicalize(input.credential.credentialType) !== jcsCanonicalize(commitment.credentialType)) throw new Error("credential does not match the signed Policy/v2 requirement");
|
|
4178
|
+
const requestedCapabilities = input.requestedCapabilities.map(normalizeUnifiedPolicyCapability);
|
|
4179
|
+
if (requestedCapabilities.length === 0 || requestedCapabilities.some((requested) => !policy.capabilityCeiling.some((authority) => unifiedPolicyCapabilityContains(authority, requested)))) throw new Error("requested capabilities exceed the signed Policy/v2 ceiling");
|
|
4180
|
+
const holderDid = input.credential.holderDid;
|
|
4181
|
+
if (input.challenge.policyCid !== input.policyCid || input.challenge.recipientDid !== holderDid || input.credential.subjectDid !== holderDid || typeof input.challenge.nodeAudience !== "string" || input.challenge.nodeAudience.length === 0 || typeof input.challenge.expiresAt !== "string" || !Number.isFinite(Date.parse(input.challenge.expiresAt))) throw new Error("policy challenge binding is invalid");
|
|
4182
|
+
const now = input.now ?? /* @__PURE__ */ new Date();
|
|
4183
|
+
const expiresAtMs = Math.min(
|
|
4184
|
+
now.getTime() + 6e4,
|
|
4185
|
+
Date.parse(input.challenge.expiresAt),
|
|
4186
|
+
Date.parse(input.credential.expiresAt)
|
|
4187
|
+
);
|
|
4188
|
+
if (expiresAtMs <= now.getTime()) throw new Error("policy challenge is expired");
|
|
4189
|
+
return signPolicyCredentialPresentationV4(Object.freeze({
|
|
4190
|
+
schema: POLICY_PRESENTATION_V4_SCHEMA,
|
|
4191
|
+
jti: input.jti ?? encodeBase64Url2(crypto.getRandomValues(new Uint8Array(16))),
|
|
4192
|
+
challengeId: input.challenge.challengeId,
|
|
4193
|
+
nonce: input.challenge.nonce,
|
|
4194
|
+
policyCid: input.policyCid,
|
|
4195
|
+
nodeAudience: input.challenge.nodeAudience,
|
|
4196
|
+
holderDid,
|
|
4197
|
+
subjectDid: holderDid,
|
|
4198
|
+
credentialDigest,
|
|
4199
|
+
requirementDigest,
|
|
4200
|
+
descriptorDigest: input.credential.descriptorDigest,
|
|
4201
|
+
requestedCapabilities: Object.freeze(requestedCapabilities),
|
|
4202
|
+
issuedAt: rfc3339Seconds(now),
|
|
4203
|
+
expiresAt: rfc3339Seconds(new Date(expiresAtMs))
|
|
4204
|
+
}), input.sign);
|
|
4205
|
+
}
|
|
4102
4206
|
async function buildPolicyCredentialPresentationV3(input) {
|
|
4103
4207
|
const policy = validateUnifiedPolicyV2(input.policy, input.policyCid);
|
|
4104
4208
|
const requirement = validateCredentialRequirement(input.requirement);
|
|
@@ -4188,7 +4292,8 @@ async function admitPolicyCredentialV3(input) {
|
|
|
4188
4292
|
policyCid: input.policyCid,
|
|
4189
4293
|
recipientDid: input.credential.holderDid,
|
|
4190
4294
|
requestedCapabilities: input.requestedCapabilities,
|
|
4191
|
-
fetch: fetchFn
|
|
4295
|
+
fetch: fetchFn,
|
|
4296
|
+
signal: input.signal
|
|
4192
4297
|
});
|
|
4193
4298
|
const presentation = await buildPolicyCredentialPresentationV3({
|
|
4194
4299
|
...input,
|
|
@@ -4200,6 +4305,7 @@ async function admitPolicyCredentialV3(input) {
|
|
|
4200
4305
|
{
|
|
4201
4306
|
method: "POST",
|
|
4202
4307
|
redirect: "error",
|
|
4308
|
+
signal: input.signal,
|
|
4203
4309
|
headers: { accept: "application/json", "content-type": "application/json" },
|
|
4204
4310
|
body: JSON.stringify({
|
|
4205
4311
|
policyCid: input.policyCid,
|
|
@@ -4228,6 +4334,57 @@ async function admitPolicyCredentialV3(input) {
|
|
|
4228
4334
|
if (session.cid !== value.sessionCid || session.aud !== input.credential.holderDid || session.fact.policyCid !== input.policyCid || session.fact.recipientDid !== input.credential.holderDid || session.fact.policyDelegationCid !== input.policyRootCid || session.fact.enforcementDelegationCid !== input.enforcementRootCid || jcsCanonicalize(session.att) !== jcsCanonicalize(expectedAttenuation)) {
|
|
4229
4335
|
throw new Error("policy delegation signed binding is invalid");
|
|
4230
4336
|
}
|
|
4337
|
+
input.signal?.throwIfAborted();
|
|
4338
|
+
return Object.freeze({ challenge, presentation, session });
|
|
4339
|
+
}
|
|
4340
|
+
function validatePolicyCredentialAdmissionV4Authority(session, expected) {
|
|
4341
|
+
if (session.iss.split("#", 1)[0] !== expected.nodeAudience || session.fact.nodeAudience !== expected.nodeAudience || session.fact.enforcerDid !== expected.enforcerDid) throw new Error("policy delegation authority binding is invalid");
|
|
4342
|
+
}
|
|
4343
|
+
async function admitPolicyCredentialV4(input) {
|
|
4344
|
+
const policy = validateUnifiedPolicyV2(input.policy, input.policyCid);
|
|
4345
|
+
const nodeOrigin = policyNodeOrigin(input.nodeOrigin);
|
|
4346
|
+
const fetchFn = input.fetch ?? globalThis.fetch.bind(globalThis);
|
|
4347
|
+
const challenge = await requestPolicyChallengeV3({
|
|
4348
|
+
nodeOrigin,
|
|
4349
|
+
policyCid: input.policyCid,
|
|
4350
|
+
recipientDid: input.credential.holderDid,
|
|
4351
|
+
requestedCapabilities: input.requestedCapabilities,
|
|
4352
|
+
fetch: fetchFn,
|
|
4353
|
+
signal: input.signal
|
|
4354
|
+
});
|
|
4355
|
+
const presentation = await buildPolicyCredentialPresentationV4({
|
|
4356
|
+
...input,
|
|
4357
|
+
policy,
|
|
4358
|
+
challenge
|
|
4359
|
+
});
|
|
4360
|
+
const response = await fetchFn(new URL("/share/v3/policy/delegations", nodeOrigin), {
|
|
4361
|
+
method: "POST",
|
|
4362
|
+
redirect: "error",
|
|
4363
|
+
signal: input.signal,
|
|
4364
|
+
headers: { accept: "application/json", "content-type": "application/json" },
|
|
4365
|
+
body: JSON.stringify({
|
|
4366
|
+
policyCid: input.policyCid,
|
|
4367
|
+
challengeId: challenge.challengeId,
|
|
4368
|
+
nonce: challenge.nonce,
|
|
4369
|
+
requirement: validateCredentialRequirement(input.requirement),
|
|
4370
|
+
credential: envelopeFromVerified(input.credential),
|
|
4371
|
+
presentation
|
|
4372
|
+
})
|
|
4373
|
+
});
|
|
4374
|
+
if (!response.ok) throw new Error(`policy delegation rejected (${response.status})`);
|
|
4375
|
+
const value = record(await response.json(), "policy delegation");
|
|
4376
|
+
if (value.admitted !== true || typeof value.sessionCid !== "string" || typeof value.authorization !== "string") throw new Error("policy delegation response is invalid");
|
|
4377
|
+
const session = parsePolicySessionUcan(value.authorization, [
|
|
4378
|
+
input.policyRootCid,
|
|
4379
|
+
input.enforcementRootCid
|
|
4380
|
+
]);
|
|
4381
|
+
const expectedAttenuation = compactAttenuationForPolicyCapabilities(input.requestedCapabilities);
|
|
4382
|
+
validatePolicyCredentialAdmissionV4Authority(session, {
|
|
4383
|
+
nodeAudience: input.expectedNodeAudience,
|
|
4384
|
+
enforcerDid: input.expectedEnforcerDid
|
|
4385
|
+
});
|
|
4386
|
+
if (session.cid !== value.sessionCid || session.aud !== input.credential.holderDid || session.fact.policyCid !== input.policyCid || session.fact.recipientDid !== input.credential.holderDid || session.fact.policyDelegationCid !== input.policyRootCid || session.fact.enforcementDelegationCid !== input.enforcementRootCid || jcsCanonicalize(session.att) !== jcsCanonicalize(expectedAttenuation)) throw new Error("policy delegation signed binding is invalid");
|
|
4387
|
+
input.signal?.throwIfAborted();
|
|
4231
4388
|
return Object.freeze({ challenge, presentation, session });
|
|
4232
4389
|
}
|
|
4233
4390
|
export {
|
|
@@ -4247,6 +4404,8 @@ export {
|
|
|
4247
4404
|
POLICY_ENGINE_RECORD_SCHEMA,
|
|
4248
4405
|
POLICY_PRESENTATION_V3_DOMAIN,
|
|
4249
4406
|
POLICY_PRESENTATION_V3_SCHEMA,
|
|
4407
|
+
POLICY_PRESENTATION_V4_DOMAIN,
|
|
4408
|
+
POLICY_PRESENTATION_V4_SCHEMA,
|
|
4250
4409
|
POLICY_SCHEMA,
|
|
4251
4410
|
POLICY_SESSION_UCAN_V1_PROFILE,
|
|
4252
4411
|
POLICY_STATUS_SCHEMA,
|
|
@@ -4274,7 +4433,9 @@ export {
|
|
|
4274
4433
|
UnsupportedSignatureSuiteError,
|
|
4275
4434
|
W3C_VC_CREDENTIAL_VERIFIER,
|
|
4276
4435
|
admitPolicyCredentialV3,
|
|
4436
|
+
admitPolicyCredentialV4,
|
|
4277
4437
|
buildPolicyCredentialPresentationV3,
|
|
4438
|
+
buildPolicyCredentialPresentationV4,
|
|
4278
4439
|
canonicalizePolicyCapability,
|
|
4279
4440
|
canonicalizeSignedObjectUnsigned,
|
|
4280
4441
|
canonicalizeUnifiedPolicyCapability,
|
|
@@ -4292,6 +4453,7 @@ export {
|
|
|
4292
4453
|
createUnsignedPolicyEngineRecord,
|
|
4293
4454
|
deriveSignedObjectMaterial,
|
|
4294
4455
|
getPolicyRootStatusV3,
|
|
4456
|
+
issuedCredentialEnvelopeFromVerified,
|
|
4295
4457
|
jcsCanonicalize,
|
|
4296
4458
|
mintPolicySessionV3,
|
|
4297
4459
|
normalizeJson,
|
|
@@ -4313,6 +4475,7 @@ export {
|
|
|
4313
4475
|
serialize as serializeJcsJson,
|
|
4314
4476
|
signCompactUcanAuthorization,
|
|
4315
4477
|
signCompactUcanRootAuthorization,
|
|
4478
|
+
signPolicyCredentialPresentationV4,
|
|
4316
4479
|
signedObjectIdFor,
|
|
4317
4480
|
toSignedObjectError,
|
|
4318
4481
|
unifiedNativeProjectionHashHex,
|