@peac/mappings-ucp 0.15.1 → 0.15.3
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/README.md +56 -6
- package/dist/bundle.d.ts +5 -0
- package/dist/bundle.d.ts.map +1 -1
- package/dist/bundle.js +5 -0
- package/dist/bundle.js.map +1 -1
- package/dist/errors.d.ts +10 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +28 -0
- package/dist/errors.js.map +1 -1
- package/dist/evidence.d.ts +0 -1
- package/dist/evidence.d.ts.map +1 -1
- package/dist/evidence.js +5 -6
- package/dist/evidence.js.map +1 -1
- package/dist/http-signature.d.ts +52 -0
- package/dist/http-signature.d.ts.map +1 -0
- package/dist/http-signature.js +592 -0
- package/dist/http-signature.js.map +1 -0
- package/dist/index.d.ts +35 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -18
- package/dist/index.js.map +1 -1
- package/dist/mapper.d.ts +4 -2
- package/dist/mapper.d.ts.map +1 -1
- package/dist/mapper.js +4 -2
- package/dist/mapper.js.map +1 -1
- package/dist/types.d.ts +108 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +9 -2
- package/dist/types.js.map +1 -1
- package/dist/util.d.ts +4 -13
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +4 -85
- package/dist/util.js.map +1 -1
- package/dist/verify.d.ts +17 -2
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +30 -5
- package/dist/verify.js.map +1 -1
- package/package.json +7 -5
package/dist/index.d.ts
CHANGED
|
@@ -1,27 +1,43 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @peac/mappings-ucp
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Universal Commerce Protocol (UCP) mapping to PEAC receipts and dispute
|
|
5
|
+
* evidence.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
* -
|
|
9
|
-
*
|
|
10
|
-
* -
|
|
7
|
+
* Signature verification:
|
|
8
|
+
* - `verifyUcpHttpSignature` verifies the current UCP signing model:
|
|
9
|
+
* request-shaped RFC 9421 HTTP Message Signatures (ES256/ES384) with an
|
|
10
|
+
* RFC 9530 Content-Digest over raw body bytes. Response signatures (which use
|
|
11
|
+
* `@status`) are out of scope.
|
|
12
|
+
* - `verifyUcpWebhookSignature` remains for the legacy `Request-Signature`
|
|
13
|
+
* detached-JWS (RFC 7797) compatibility path; the two never silently fall back
|
|
14
|
+
* to each other.
|
|
15
|
+
*
|
|
16
|
+
* Also: UCP order to PEAC receipt mapping and dispute evidence generation for
|
|
17
|
+
* @peac/audit bundles.
|
|
11
18
|
*
|
|
12
19
|
* @example
|
|
13
20
|
* ```ts
|
|
14
|
-
* import {
|
|
15
|
-
*
|
|
16
|
-
* mapUcpOrderToReceipt,
|
|
17
|
-
* createUcpDisputeEvidence,
|
|
18
|
-
* } from '@peac/mappings-ucp';
|
|
21
|
+
* import { verifyUcpHttpSignature, mapUcpOrderToReceipt } from '@peac/mappings-ucp';
|
|
22
|
+
* import { sign } from '@peac/crypto';
|
|
19
23
|
*
|
|
20
|
-
* // Verify
|
|
21
|
-
*
|
|
22
|
-
*
|
|
24
|
+
* // Verify the current UCP signing model (RFC 9421 HTTP Message Signature).
|
|
25
|
+
* // The /.well-known/ucp profile is resolved by the caller (SSRF-safe) and
|
|
26
|
+
* // passed in; this function performs no network I/O.
|
|
27
|
+
* const result = await verifyUcpHttpSignature({
|
|
28
|
+
* signature_input: req.headers['signature-input'],
|
|
29
|
+
* signature: req.headers['signature'],
|
|
30
|
+
* method: 'POST',
|
|
31
|
+
* url: 'https://platform.example.com/webhooks/ucp/orders',
|
|
32
|
+
* headers: {
|
|
33
|
+
* 'content-type': req.headers['content-type'],
|
|
34
|
+
* 'content-digest': req.headers['content-digest'],
|
|
35
|
+
* 'idempotency-key': req.headers['idempotency-key'],
|
|
36
|
+
* 'ucp-agent': req.headers['ucp-agent'],
|
|
37
|
+
* },
|
|
23
38
|
* body_bytes: rawBody,
|
|
24
|
-
*
|
|
39
|
+
* profile: ucpProfile,
|
|
40
|
+
* expected_profile_url: 'https://business.example.com/.well-known/ucp', // bind the signer
|
|
25
41
|
* });
|
|
26
42
|
*
|
|
27
43
|
* if (result.valid) {
|
|
@@ -33,18 +49,19 @@
|
|
|
33
49
|
* currency: 'USD',
|
|
34
50
|
* });
|
|
35
51
|
*
|
|
36
|
-
* // Sign
|
|
37
|
-
* const
|
|
52
|
+
* // Sign the mapped claims into a JWS receipt
|
|
53
|
+
* const receiptJws = await sign(claims, privateKey, kid);
|
|
38
54
|
* }
|
|
39
55
|
* ```
|
|
40
56
|
*/
|
|
41
57
|
export type { UcpWebhookPayload, UcpExtractResult, UcpExtractAsyncResult } from './carrier.js';
|
|
42
58
|
export { UCP_MAX_CARRIER_SIZE, UCP_LEGACY_EXTENSION_KEY, attachCarrierToWebhookPayload, extractCarrierFromWebhookPayload, extractCarrierFromWebhookPayloadAsync, UcpCarrierAdapter, } from './carrier.js';
|
|
43
|
-
export type { UcpSignatureAlgorithm, MinorUnits, VerificationMode, B64Mode, UcpJwsHeader, ParsedDetachedJws, UcpSigningKey, UcpProfile, UcpCapability, VerificationAttempt, PayloadEvidence, SignatureEvidence, ProfileSnapshot, WebhookEventMeta, UcpWebhookEvidence, LinkedReceipt, VerifyUcpWebhookOptions, VerifyUcpWebhookResult, UcpLineItem, UcpOrder, MapUcpOrderOptions, MappedReceiptClaims, UcpOrderState, UcpPaymentState, } from './types.js';
|
|
59
|
+
export type { UcpSignatureAlgorithm, MinorUnits, VerificationMode, B64Mode, UcpJwsHeader, ParsedDetachedJws, UcpSigningKey, UcpProfile, UcpCapability, VerificationAttempt, PayloadEvidence, SignatureEvidence, ProfileSnapshot, WebhookEventMeta, UcpWebhookEvidence, LinkedReceipt, VerifyUcpWebhookOptions, VerifyUcpWebhookResult, UcpHttpSignatureAlgorithm, UcpComponentPolicy, VerifyUcpHttpSignatureOptions, VerifyUcpHttpSignatureResult, UcpLineItem, UcpOrder, MapUcpOrderOptions, MappedReceiptClaims, UcpOrderState, UcpPaymentState, } from './types.js';
|
|
44
60
|
export { UCP_EVIDENCE_VERSION } from './types.js';
|
|
45
61
|
export { ErrorCodes, ErrorHttpStatus, UcpError, ucpError } from './errors.js';
|
|
46
62
|
export type { ErrorCode } from './errors.js';
|
|
47
63
|
export { verifyUcpWebhookSignature, parseDetachedJws, findSigningKey } from './verify.js';
|
|
64
|
+
export { verifyUcpHttpSignature } from './http-signature.js';
|
|
48
65
|
export { mapUcpOrderToReceipt, extractLineItemSummary, calculateOrderStats } from './mapper.js';
|
|
49
66
|
export { createUcpWebhookEvidence, serializeEvidenceYaml, createPayloadEvidence, createSignatureEvidence, createProfileSnapshot, } from './evidence.js';
|
|
50
67
|
export type { CreateEvidenceOptions } from './evidence.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAGH,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE/F,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,6BAA6B,EAC7B,gCAAgC,EAChC,qCAAqC,EACrC,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAGtB,YAAY,EAEV,qBAAqB,EACrB,UAAU,EACV,gBAAgB,EAChB,OAAO,EAEP,YAAY,EACZ,iBAAiB,EAEjB,aAAa,EACb,UAAU,EACV,aAAa,EAEb,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EAEb,uBAAuB,EACvB,sBAAsB,EAEtB,yBAAyB,EACzB,kBAAkB,EAClB,6BAA6B,EAC7B,4BAA4B,EAE5B,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EAEnB,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC9E,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAG7D,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGhG,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,eAAe,CAAC;AAEvB,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAG3D,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,+BAA+B,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,27 +1,43 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @peac/mappings-ucp
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Universal Commerce Protocol (UCP) mapping to PEAC receipts and dispute
|
|
5
|
+
* evidence.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
* -
|
|
9
|
-
*
|
|
10
|
-
* -
|
|
7
|
+
* Signature verification:
|
|
8
|
+
* - `verifyUcpHttpSignature` verifies the current UCP signing model:
|
|
9
|
+
* request-shaped RFC 9421 HTTP Message Signatures (ES256/ES384) with an
|
|
10
|
+
* RFC 9530 Content-Digest over raw body bytes. Response signatures (which use
|
|
11
|
+
* `@status`) are out of scope.
|
|
12
|
+
* - `verifyUcpWebhookSignature` remains for the legacy `Request-Signature`
|
|
13
|
+
* detached-JWS (RFC 7797) compatibility path; the two never silently fall back
|
|
14
|
+
* to each other.
|
|
15
|
+
*
|
|
16
|
+
* Also: UCP order to PEAC receipt mapping and dispute evidence generation for
|
|
17
|
+
* @peac/audit bundles.
|
|
11
18
|
*
|
|
12
19
|
* @example
|
|
13
20
|
* ```ts
|
|
14
|
-
* import {
|
|
15
|
-
*
|
|
16
|
-
* mapUcpOrderToReceipt,
|
|
17
|
-
* createUcpDisputeEvidence,
|
|
18
|
-
* } from '@peac/mappings-ucp';
|
|
21
|
+
* import { verifyUcpHttpSignature, mapUcpOrderToReceipt } from '@peac/mappings-ucp';
|
|
22
|
+
* import { sign } from '@peac/crypto';
|
|
19
23
|
*
|
|
20
|
-
* // Verify
|
|
21
|
-
*
|
|
22
|
-
*
|
|
24
|
+
* // Verify the current UCP signing model (RFC 9421 HTTP Message Signature).
|
|
25
|
+
* // The /.well-known/ucp profile is resolved by the caller (SSRF-safe) and
|
|
26
|
+
* // passed in; this function performs no network I/O.
|
|
27
|
+
* const result = await verifyUcpHttpSignature({
|
|
28
|
+
* signature_input: req.headers['signature-input'],
|
|
29
|
+
* signature: req.headers['signature'],
|
|
30
|
+
* method: 'POST',
|
|
31
|
+
* url: 'https://platform.example.com/webhooks/ucp/orders',
|
|
32
|
+
* headers: {
|
|
33
|
+
* 'content-type': req.headers['content-type'],
|
|
34
|
+
* 'content-digest': req.headers['content-digest'],
|
|
35
|
+
* 'idempotency-key': req.headers['idempotency-key'],
|
|
36
|
+
* 'ucp-agent': req.headers['ucp-agent'],
|
|
37
|
+
* },
|
|
23
38
|
* body_bytes: rawBody,
|
|
24
|
-
*
|
|
39
|
+
* profile: ucpProfile,
|
|
40
|
+
* expected_profile_url: 'https://business.example.com/.well-known/ucp', // bind the signer
|
|
25
41
|
* });
|
|
26
42
|
*
|
|
27
43
|
* if (result.valid) {
|
|
@@ -33,8 +49,8 @@
|
|
|
33
49
|
* currency: 'USD',
|
|
34
50
|
* });
|
|
35
51
|
*
|
|
36
|
-
* // Sign
|
|
37
|
-
* const
|
|
52
|
+
* // Sign the mapped claims into a JWS receipt
|
|
53
|
+
* const receiptJws = await sign(claims, privateKey, kid);
|
|
38
54
|
* }
|
|
39
55
|
* ```
|
|
40
56
|
*/
|
|
@@ -42,8 +58,10 @@ export { UCP_MAX_CARRIER_SIZE, UCP_LEGACY_EXTENSION_KEY, attachCarrierToWebhookP
|
|
|
42
58
|
export { UCP_EVIDENCE_VERSION } from './types.js';
|
|
43
59
|
// Errors
|
|
44
60
|
export { ErrorCodes, ErrorHttpStatus, UcpError, ucpError } from './errors.js';
|
|
45
|
-
// Verification
|
|
61
|
+
// Verification (legacy Request-Signature / RFC 7797 detached JWS)
|
|
46
62
|
export { verifyUcpWebhookSignature, parseDetachedJws, findSigningKey } from './verify.js';
|
|
63
|
+
// Verification (current UCP model: RFC 9421 HTTP Message Signatures)
|
|
64
|
+
export { verifyUcpHttpSignature } from './http-signature.js';
|
|
47
65
|
// Mapping
|
|
48
66
|
export { mapUcpOrderToReceipt, extractLineItemSummary, calculateOrderStats } from './mapper.js';
|
|
49
67
|
// Evidence
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAKH,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,6BAA6B,EAC7B,gCAAgC,EAChC,qCAAqC,EACrC,iBAAiB,GAClB,MAAM,cAAc,CAAC;AA0CtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG9E,kEAAkE;AAClE,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE1F,qEAAqE;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,UAAU;AACV,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEhG,WAAW;AACX,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,eAAe,CAAC;AAIvB,iBAAiB;AACjB,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,4BAA4B,GAC7B,MAAM,aAAa,CAAC"}
|
package/dist/mapper.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ import type { UcpOrder, MapUcpOrderOptions, MappedReceiptClaims, MinorUnits } fr
|
|
|
13
13
|
*
|
|
14
14
|
* @example
|
|
15
15
|
* ```ts
|
|
16
|
+
* import { sign } from '@peac/crypto';
|
|
17
|
+
*
|
|
16
18
|
* const claims = mapUcpOrderToReceipt({
|
|
17
19
|
* order: ucpOrder,
|
|
18
20
|
* issuer: 'https://merchant.example.com',
|
|
@@ -20,8 +22,8 @@ import type { UcpOrder, MapUcpOrderOptions, MappedReceiptClaims, MinorUnits } fr
|
|
|
20
22
|
* currency: 'USD',
|
|
21
23
|
* });
|
|
22
24
|
*
|
|
23
|
-
* // Sign
|
|
24
|
-
* const
|
|
25
|
+
* // Sign the mapped claims into a JWS receipt (Ed25519 private key + kid)
|
|
26
|
+
* const receiptJws = await sign(claims, privateKey, kid);
|
|
25
27
|
* ```
|
|
26
28
|
*/
|
|
27
29
|
export declare function mapUcpOrderToReceipt(options: MapUcpOrderOptions): MappedReceiptClaims;
|
package/dist/mapper.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../src/mapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,EAEX,MAAM,YAAY,CAAC;AAkGpB
|
|
1
|
+
{"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../src/mapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,EAEX,MAAM,YAAY,CAAC;AAkGpB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,GAAG,mBAAmB,CA0DrF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,GAAG,KAAK,CAAC;IAC7D,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAQD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,GAAG;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CA0BA"}
|
package/dist/mapper.js
CHANGED
|
@@ -92,6 +92,8 @@ function paymentStateToStatus(state) {
|
|
|
92
92
|
*
|
|
93
93
|
* @example
|
|
94
94
|
* ```ts
|
|
95
|
+
* import { sign } from '@peac/crypto';
|
|
96
|
+
*
|
|
95
97
|
* const claims = mapUcpOrderToReceipt({
|
|
96
98
|
* order: ucpOrder,
|
|
97
99
|
* issuer: 'https://merchant.example.com',
|
|
@@ -99,8 +101,8 @@ function paymentStateToStatus(state) {
|
|
|
99
101
|
* currency: 'USD',
|
|
100
102
|
* });
|
|
101
103
|
*
|
|
102
|
-
* // Sign
|
|
103
|
-
* const
|
|
104
|
+
* // Sign the mapped claims into a JWS receipt (Ed25519 private key + kid)
|
|
105
|
+
* const receiptJws = await sign(claims, privateKey, kid);
|
|
104
106
|
* ```
|
|
105
107
|
*/
|
|
106
108
|
export function mapUcpOrderToReceipt(options) {
|
package/dist/mapper.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapper.js","sourceRoot":"","sources":["../src/mapper.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"mapper.js","sourceRoot":"","sources":["../src/mapper.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @peac/mappings-ucp - Type definitions
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Universal Commerce Protocol (UCP) types and evidence schema.
|
|
5
|
+
*
|
|
6
|
+
* The current UCP signing model is RFC 9421 HTTP Message Signatures
|
|
7
|
+
* (`Signature-Input` / `Signature` with an RFC 9530 `Content-Digest` over the
|
|
8
|
+
* raw body bytes; ES256 for P-256, ES384 for P-384), modeled by the
|
|
9
|
+
* `VerifyUcpHttpSignature*` types and verified by `verifyUcpHttpSignature`.
|
|
10
|
+
* The detached JWS (RFC 7797) `Request-Signature` types below model the legacy,
|
|
11
|
+
* deprecated `verifyUcpWebhookSignature` path; the two never silently fall back
|
|
12
|
+
* to each other.
|
|
6
13
|
*/
|
|
7
14
|
/**
|
|
8
15
|
* UCP Evidence schema version.
|
|
@@ -262,6 +269,105 @@ export interface VerifyUcpWebhookResult {
|
|
|
262
269
|
/** Error message (if invalid) */
|
|
263
270
|
error_message?: string;
|
|
264
271
|
}
|
|
272
|
+
/**
|
|
273
|
+
* HTTP Message Signature algorithm (RFC 9421) supported for UCP.
|
|
274
|
+
*
|
|
275
|
+
* UCP requires ES256 (P-256); ES384 (P-384) is OPTIONAL. Ed25519 is not used
|
|
276
|
+
* at the UCP wire layer, so it is intentionally excluded here.
|
|
277
|
+
*
|
|
278
|
+
* This is the algorithm RESOLVED from the signing key's curve (P-256 -> ES256,
|
|
279
|
+
* P-384 -> ES384), not a value read from the `Signature-Input` `alg` parameter:
|
|
280
|
+
* UCP does not include `alg` in `Signature-Input`.
|
|
281
|
+
*/
|
|
282
|
+
export type UcpHttpSignatureAlgorithm = 'ES256' | 'ES384';
|
|
283
|
+
/**
|
|
284
|
+
* Required signed-component policy for UCP HTTP Message Signature verification.
|
|
285
|
+
*
|
|
286
|
+
* - `ucp-request` (default): the full UCP request policy. Always requires
|
|
287
|
+
* `@method`, `@authority`, `@path`; `@query` when the URL has a query string;
|
|
288
|
+
* `ucp-agent` when a `UCP-Agent` header is present; `idempotency-key` for
|
|
289
|
+
* state-changing methods (POST/PUT/DELETE/PATCH); and `content-digest` +
|
|
290
|
+
* `content-type` when a body is present. This also applies to webhook
|
|
291
|
+
* deliveries: UCP does not define a separate webhook component set, and
|
|
292
|
+
* webhook POSTs are not exempt from the idempotency-key requirement.
|
|
293
|
+
* - `signature-only`: low-level mode. Verifies the signature and, when a body is
|
|
294
|
+
* present and covered, the Content-Digest, but does NOT enforce the required
|
|
295
|
+
* component set. Use only when the caller enforces component coverage itself.
|
|
296
|
+
*
|
|
297
|
+
* Note: UCP response signatures use `@status` instead of `@method` and are a
|
|
298
|
+
* separate component model; this verifier covers request-shaped signatures only.
|
|
299
|
+
*/
|
|
300
|
+
export type UcpComponentPolicy = 'ucp-request' | 'signature-only';
|
|
301
|
+
/**
|
|
302
|
+
* Options for verifying a UCP request/webhook RFC 9421 HTTP Message Signature.
|
|
303
|
+
*
|
|
304
|
+
* This is the current UCP signing model (`Signature-Input` / `Signature` /
|
|
305
|
+
* `Content-Digest` over raw body bytes), distinct from the legacy
|
|
306
|
+
* `Request-Signature` detached-JWS path verified by `verifyUcpWebhookSignature`.
|
|
307
|
+
* There is no silent fallback between the two: the caller selects the scheme.
|
|
308
|
+
*/
|
|
309
|
+
export interface VerifyUcpHttpSignatureOptions {
|
|
310
|
+
/** RFC 9421 `Signature-Input` header value. */
|
|
311
|
+
signature_input: string;
|
|
312
|
+
/** RFC 9421 `Signature` header value. */
|
|
313
|
+
signature: string;
|
|
314
|
+
/** HTTP method (e.g. 'POST'). */
|
|
315
|
+
method: string;
|
|
316
|
+
/** Absolute request URL (used for `@authority` / `@path` / `@query` derived components). */
|
|
317
|
+
url: string;
|
|
318
|
+
/** Request headers (case-insensitive lookup; e.g. `content-digest`, `ucp-agent`). */
|
|
319
|
+
headers: Record<string, string>;
|
|
320
|
+
/**
|
|
321
|
+
* Raw request body bytes. Required (and bound via `content-digest`) whenever a
|
|
322
|
+
* body is present; never JSON-canonicalized before digesting (UCP binds raw bytes).
|
|
323
|
+
*/
|
|
324
|
+
body_bytes?: Uint8Array;
|
|
325
|
+
/**
|
|
326
|
+
* Pre-resolved UCP party profile (the `/.well-known/ucp` document). Resolving it
|
|
327
|
+
* is the caller's responsibility (SSRF-safe, host-allowlisted); tests pass a fixture.
|
|
328
|
+
* No network I/O happens inside this function.
|
|
329
|
+
*/
|
|
330
|
+
profile: UcpProfile;
|
|
331
|
+
/** Optional specific signature label to verify (defaults to the first in `Signature-Input`). */
|
|
332
|
+
label?: string;
|
|
333
|
+
/**
|
|
334
|
+
* Required signed-component policy. Defaults to `'ucp-request'` (strict). Use
|
|
335
|
+
* `'signature-only'` for low-level verification without component enforcement.
|
|
336
|
+
*/
|
|
337
|
+
component_policy?: UcpComponentPolicy;
|
|
338
|
+
/**
|
|
339
|
+
* Optional expected signer profile URL to bind. When provided, the `ucp-agent`
|
|
340
|
+
* component MUST be signed, the `UCP-Agent` header MUST be present and parse as
|
|
341
|
+
* an RFC 8941 dictionary with a quoted HTTPS `profile` member, and that profile
|
|
342
|
+
* URL MUST equal this value; otherwise verification fails. An unsigned component
|
|
343
|
+
* is never trusted. This verifier never fetches the profile URL (SSRF stays out).
|
|
344
|
+
*/
|
|
345
|
+
expected_profile_url?: string;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Result of verifying a UCP RFC 9421 HTTP Message Signature.
|
|
349
|
+
*/
|
|
350
|
+
export interface VerifyUcpHttpSignatureResult {
|
|
351
|
+
/** Whether the signature (and `Content-Digest`, when present) verified. */
|
|
352
|
+
valid: boolean;
|
|
353
|
+
/** Algorithm resolved from the signing key's curve (P-256 -> ES256, P-384 -> ES384). */
|
|
354
|
+
alg?: UcpHttpSignatureAlgorithm;
|
|
355
|
+
/** `keyid` from `Signature-Input`, matched against `signing_keys[].kid`. */
|
|
356
|
+
keyid?: string;
|
|
357
|
+
/** Covered components from `Signature-Input` (for evidence capture). */
|
|
358
|
+
covered_components?: string[];
|
|
359
|
+
/** Whether a `Content-Digest` was present and verified over the raw body bytes. */
|
|
360
|
+
content_digest_verified?: boolean;
|
|
361
|
+
/**
|
|
362
|
+
* The signer profile URL parsed from a signed `UCP-Agent` header, when one was
|
|
363
|
+
* present and validated (evidence for the caller; never fetched here).
|
|
364
|
+
*/
|
|
365
|
+
signer_profile_url?: string;
|
|
366
|
+
/** Error code (`E_UCP_*`) when invalid. */
|
|
367
|
+
error_code?: string;
|
|
368
|
+
/** Error message when invalid. */
|
|
369
|
+
error_message?: string;
|
|
370
|
+
}
|
|
265
371
|
/**
|
|
266
372
|
* UCP order line item for receipt mapping.
|
|
267
373
|
*/
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @peac/mappings-ucp - Type definitions
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Universal Commerce Protocol (UCP) types and evidence schema.
|
|
5
|
+
*
|
|
6
|
+
* The current UCP signing model is RFC 9421 HTTP Message Signatures
|
|
7
|
+
* (`Signature-Input` / `Signature` with an RFC 9530 `Content-Digest` over the
|
|
8
|
+
* raw body bytes; ES256 for P-256, ES384 for P-384), modeled by the
|
|
9
|
+
* `VerifyUcpHttpSignature*` types and verified by `verifyUcpHttpSignature`.
|
|
10
|
+
* The detached JWS (RFC 7797) `Request-Signature` types below model the legacy,
|
|
11
|
+
* deprecated `verifyUcpWebhookSignature` path; the two never silently fall back
|
|
12
|
+
* to each other.
|
|
6
13
|
*/
|
|
7
14
|
/**
|
|
8
15
|
* UCP Evidence schema version.
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAAmC,CAAC"}
|
package/dist/util.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @peac/mappings-ucp - Shared utilities
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* SHA-256 helpers used by verification and evidence generation. base64url
|
|
5
|
+
* encoding and JCS canonicalization are reused from @peac/crypto directly at
|
|
6
|
+
* the call sites (verify.ts / evidence.ts); these SHA-256 helpers stay local
|
|
7
|
+
* and synchronous (node:crypto) pending the H3 sha256 sync/async consolidation.
|
|
6
8
|
*/
|
|
7
9
|
/**
|
|
8
10
|
* SHA-256 hash as hex string.
|
|
@@ -12,15 +14,4 @@ export declare function sha256Hex(data: Uint8Array): string;
|
|
|
12
14
|
* SHA-256 hash as Uint8Array.
|
|
13
15
|
*/
|
|
14
16
|
export declare function sha256Bytes(data: Uint8Array): Uint8Array;
|
|
15
|
-
/**
|
|
16
|
-
* Base64url encode without padding.
|
|
17
|
-
* Uses standard base64 + manual conversion for maximum portability.
|
|
18
|
-
* Works with Node.js 12+ (does not require 'base64url' encoding from Node 15.7.0+).
|
|
19
|
-
*/
|
|
20
|
-
export declare function base64urlEncode(data: Uint8Array): string;
|
|
21
|
-
/**
|
|
22
|
-
* JCS canonicalize (RFC 8785) - synchronous.
|
|
23
|
-
* Produces deterministic JSON with sorted keys and no whitespace.
|
|
24
|
-
*/
|
|
25
|
-
export declare function jcsCanonicalizeSync(obj: unknown): string;
|
|
26
17
|
//# sourceMappingURL=util.d.ts.map
|
package/dist/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAExD"}
|
package/dist/util.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @peac/mappings-ucp - Shared utilities
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* SHA-256 helpers used by verification and evidence generation. base64url
|
|
5
|
+
* encoding and JCS canonicalization are reused from @peac/crypto directly at
|
|
6
|
+
* the call sites (verify.ts / evidence.ts); these SHA-256 helpers stay local
|
|
7
|
+
* and synchronous (node:crypto) pending the H3 sha256 sync/async consolidation.
|
|
6
8
|
*/
|
|
7
9
|
import { createHash } from 'node:crypto';
|
|
8
|
-
import { ErrorCodes, ucpError } from './errors.js';
|
|
9
10
|
/**
|
|
10
11
|
* SHA-256 hash as hex string.
|
|
11
12
|
*/
|
|
@@ -18,86 +19,4 @@ export function sha256Hex(data) {
|
|
|
18
19
|
export function sha256Bytes(data) {
|
|
19
20
|
return new Uint8Array(createHash('sha256').update(data).digest());
|
|
20
21
|
}
|
|
21
|
-
/**
|
|
22
|
-
* Convert base64 to base64url by replacing chars.
|
|
23
|
-
*/
|
|
24
|
-
function base64ToBase64url(base64) {
|
|
25
|
-
let result = '';
|
|
26
|
-
for (let i = 0; i < base64.length; i++) {
|
|
27
|
-
const c = base64.charCodeAt(i);
|
|
28
|
-
if (c === 43) {
|
|
29
|
-
// '+' -> '-'
|
|
30
|
-
result += '-';
|
|
31
|
-
}
|
|
32
|
-
else if (c === 47) {
|
|
33
|
-
// '/' -> '_'
|
|
34
|
-
result += '_';
|
|
35
|
-
}
|
|
36
|
-
else if (c === 61) {
|
|
37
|
-
// '=' padding - skip
|
|
38
|
-
break;
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
result += base64.charAt(i);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return result;
|
|
45
|
-
}
|
|
46
|
-
// Maximum size for base64url encoding (16MB - reasonable limit for webhook payloads)
|
|
47
|
-
const MAX_ENCODE_SIZE = 16 * 1024 * 1024;
|
|
48
|
-
/**
|
|
49
|
-
* Base64url encode without padding.
|
|
50
|
-
* Uses standard base64 + manual conversion for maximum portability.
|
|
51
|
-
* Works with Node.js 12+ (does not require 'base64url' encoding from Node 15.7.0+).
|
|
52
|
-
*/
|
|
53
|
-
export function base64urlEncode(data) {
|
|
54
|
-
// Safety check for unreasonably large input
|
|
55
|
-
if (data.length > MAX_ENCODE_SIZE) {
|
|
56
|
-
throw ucpError(ErrorCodes.SIGNATURE_MALFORMED, `Input too large for base64url encoding: ${data.length} bytes`);
|
|
57
|
-
}
|
|
58
|
-
// Use Buffer in Node.js, then convert base64 to base64url
|
|
59
|
-
if (typeof Buffer !== 'undefined' && typeof Buffer.from === 'function') {
|
|
60
|
-
const base64 = Buffer.from(data).toString('base64');
|
|
61
|
-
return base64ToBase64url(base64);
|
|
62
|
-
}
|
|
63
|
-
// Fallback for non-Node environments (browsers)
|
|
64
|
-
// Build binary string with bounded iteration
|
|
65
|
-
const len = data.length;
|
|
66
|
-
let binary = '';
|
|
67
|
-
for (let i = 0; i < len; i++) {
|
|
68
|
-
binary += String.fromCharCode(data[i]);
|
|
69
|
-
}
|
|
70
|
-
const base64 = btoa(binary);
|
|
71
|
-
return base64ToBase64url(base64);
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* JCS canonicalize (RFC 8785) - synchronous.
|
|
75
|
-
* Produces deterministic JSON with sorted keys and no whitespace.
|
|
76
|
-
*/
|
|
77
|
-
export function jcsCanonicalizeSync(obj) {
|
|
78
|
-
if (obj === null)
|
|
79
|
-
return 'null';
|
|
80
|
-
if (typeof obj === 'boolean')
|
|
81
|
-
return obj ? 'true' : 'false';
|
|
82
|
-
if (typeof obj === 'number') {
|
|
83
|
-
if (!Number.isFinite(obj)) {
|
|
84
|
-
throw ucpError(ErrorCodes.EVIDENCE_SERIALIZATION_FAILED, 'JCS does not support NaN or Infinity');
|
|
85
|
-
}
|
|
86
|
-
// Use ES6 number serialization (matches JSON.stringify for finite numbers)
|
|
87
|
-
return Object.is(obj, -0) ? '0' : String(obj);
|
|
88
|
-
}
|
|
89
|
-
if (typeof obj === 'string')
|
|
90
|
-
return JSON.stringify(obj);
|
|
91
|
-
if (Array.isArray(obj)) {
|
|
92
|
-
return '[' + obj.map(jcsCanonicalizeSync).join(',') + ']';
|
|
93
|
-
}
|
|
94
|
-
if (typeof obj === 'object') {
|
|
95
|
-
const keys = Object.keys(obj).sort();
|
|
96
|
-
const pairs = keys
|
|
97
|
-
.filter((k) => obj[k] !== undefined)
|
|
98
|
-
.map((k) => JSON.stringify(k) + ':' + jcsCanonicalizeSync(obj[k]));
|
|
99
|
-
return '{' + pairs.join(',') + '}';
|
|
100
|
-
}
|
|
101
|
-
throw ucpError(ErrorCodes.EVIDENCE_SERIALIZATION_FAILED, `Cannot canonicalize type: ${typeof obj}`);
|
|
102
|
-
}
|
|
103
22
|
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAgB;IACxC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAgB;IAC1C,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACpE,CAAC"}
|
package/dist/verify.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @peac/mappings-ucp -
|
|
2
|
+
* @peac/mappings-ucp - Legacy webhook signature verification (deprecated)
|
|
3
|
+
*
|
|
4
|
+
* This module verifies the legacy UCP `Request-Signature` detached JWS (RFC 7797)
|
|
5
|
+
* scheme. The current UCP signing model is RFC 9421 HTTP Message Signatures; use
|
|
6
|
+
* `verifyUcpHttpSignature` from `./http-signature.js` for new integrations. These
|
|
7
|
+
* exports remain for backward compatibility and never silently fall back to (or
|
|
8
|
+
* from) the RFC 9421 path.
|
|
3
9
|
*
|
|
4
10
|
* Verifies UCP webhook signatures using detached JWS (RFC 7797).
|
|
5
11
|
* Supports ES256, ES384, ES512 algorithms with ECDSA keys.
|
|
@@ -17,6 +23,10 @@ import type { UcpProfile, UcpSigningKey, ParsedDetachedJws, VerifyUcpWebhookOpti
|
|
|
17
23
|
/**
|
|
18
24
|
* Parse a detached JWS from the Request-Signature header.
|
|
19
25
|
* Format: <protected>..<signature> (empty payload section)
|
|
26
|
+
*
|
|
27
|
+
* @deprecated Part of the legacy UCP `Request-Signature` (RFC 7797) path. The
|
|
28
|
+
* current UCP signing model is RFC 9421 HTTP Message Signatures; prefer
|
|
29
|
+
* `verifyUcpHttpSignature`. Retained for backward compatibility.
|
|
20
30
|
*/
|
|
21
31
|
export declare function parseDetachedJws(headerValue: string): ParsedDetachedJws;
|
|
22
32
|
/**
|
|
@@ -24,7 +34,12 @@ export declare function parseDetachedJws(headerValue: string): ParsedDetachedJws
|
|
|
24
34
|
*/
|
|
25
35
|
export declare function findSigningKey(profile: UcpProfile, kid: string): UcpSigningKey | undefined;
|
|
26
36
|
/**
|
|
27
|
-
* Verify a UCP webhook signature.
|
|
37
|
+
* Verify a UCP webhook signature (legacy `Request-Signature` / RFC 7797 path).
|
|
38
|
+
*
|
|
39
|
+
* @deprecated The current UCP signing model is RFC 9421 HTTP Message Signatures;
|
|
40
|
+
* use `verifyUcpHttpSignature` for new integrations. This legacy detached-JWS
|
|
41
|
+
* path remains exported for backward compatibility and never silently falls back
|
|
42
|
+
* to (or from) the RFC 9421 path.
|
|
28
43
|
*
|
|
29
44
|
* Strategy: raw-first, JCS fallback
|
|
30
45
|
* 1. Parse the detached JWS from Request-Signature header
|
package/dist/verify.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EAEb,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EAGvB,MAAM,YAAY,CAAC;AAmBpB;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,CAiIvE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAE1F;AA2FD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAkKjC"}
|