atp-sdk 1.0.0
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/CHANGELOG.md +111 -0
- package/LICENSE +201 -0
- package/README.md +633 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +55 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/client/atp.d.ts.map +1 -0
- package/dist/client/atp.js +90 -0
- package/dist/client/atp.js.map +1 -0
- package/dist/client/audit.d.ts.map +1 -0
- package/dist/client/audit.js +125 -0
- package/dist/client/audit.js.map +1 -0
- package/dist/client/base.d.ts.map +1 -0
- package/dist/client/base.js +190 -0
- package/dist/client/base.js.map +1 -0
- package/dist/client/credentials.d.ts.map +1 -0
- package/dist/client/credentials.js +112 -0
- package/dist/client/credentials.js.map +1 -0
- package/dist/client/gateway.d.ts.map +1 -0
- package/dist/client/gateway.js +214 -0
- package/dist/client/gateway.js.map +1 -0
- package/dist/client/identity.d.ts.map +1 -0
- package/dist/client/identity.js +94 -0
- package/dist/client/identity.js.map +1 -0
- package/dist/client/permissions.d.ts.map +1 -0
- package/dist/client/permissions.js +132 -0
- package/dist/client/permissions.js.map +1 -0
- package/dist/index.cjs +89 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/simple-agent.d.ts.map +1 -0
- package/dist/simple-agent.js +261 -0
- package/dist/simple-agent.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +48 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +100 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/did.d.ts.map +1 -0
- package/dist/utils/did.js +225 -0
- package/dist/utils/did.js.map +1 -0
- package/dist/utils/jwt.d.ts.map +1 -0
- package/dist/utils/jwt.js +235 -0
- package/dist/utils/jwt.js.map +1 -0
- package/docs/README.md +362 -0
- package/docs/api/README.md +1077 -0
- package/docs/guides/authentication.md +667 -0
- package/docs/guides/best-practices.md +1004 -0
- package/docs/guides/configuration.md +588 -0
- package/docs/guides/error-handling.md +1073 -0
- package/docs/guides/troubleshooting.md +850 -0
- package/examples/01-basic-setup.js +53 -0
- package/examples/02-identity-management.js +130 -0
- package/examples/03-verifiable-credentials.js +234 -0
- package/examples/04-permissions-and-access-control.js +326 -0
- package/examples/05-audit-logging.js +310 -0
- package/examples/06-real-time-monitoring.js +302 -0
- package/examples/07-advanced-use-cases.js +584 -0
- package/examples/README.md +211 -0
- package/examples/index.js +135 -0
- package/examples/simple-3-line.ts +51 -0
- package/package.json +108 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import * as ed25519 from '@noble/ed25519';
|
|
2
|
+
import { sha256 } from '@noble/hashes/sha256';
|
|
3
|
+
import { sha512 } from '@noble/hashes/sha512';
|
|
4
|
+
import { randomBytes } from 'crypto';
|
|
5
|
+
// Configure @noble/ed25519 to use SHA-512
|
|
6
|
+
ed25519.etc.sha512Sync = (...m) => sha512(ed25519.etc.concatBytes(...m));
|
|
7
|
+
/**
|
|
8
|
+
* Cryptographic utilities for ATP™ SDK
|
|
9
|
+
*/
|
|
10
|
+
export class CryptoUtils {
|
|
11
|
+
/**
|
|
12
|
+
* Generate a new Ed25519 key pair
|
|
13
|
+
*/
|
|
14
|
+
static async generateKeyPair() {
|
|
15
|
+
const privateKey = ed25519.utils.randomPrivateKey();
|
|
16
|
+
const publicKey = await ed25519.getPublicKey(privateKey);
|
|
17
|
+
return {
|
|
18
|
+
publicKey: Buffer.from(publicKey).toString('hex'),
|
|
19
|
+
privateKey: Buffer.from(privateKey).toString('hex')
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Sign data with private key
|
|
24
|
+
*/
|
|
25
|
+
static async signData(data, privateKey) {
|
|
26
|
+
const dataBuffer = typeof data === 'string' ? Buffer.from(data, 'utf8') : data;
|
|
27
|
+
const privateKeyBuffer = Buffer.from(privateKey, 'hex');
|
|
28
|
+
const signature = await ed25519.sign(dataBuffer, privateKeyBuffer);
|
|
29
|
+
return Buffer.from(signature).toString('hex');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Verify signature with public key
|
|
33
|
+
*/
|
|
34
|
+
static async verifySignature(data, signature, publicKey) {
|
|
35
|
+
try {
|
|
36
|
+
const dataBuffer = typeof data === 'string' ? Buffer.from(data, 'utf8') : data;
|
|
37
|
+
const signatureBuffer = Buffer.from(signature, 'hex');
|
|
38
|
+
const publicKeyBuffer = Buffer.from(publicKey, 'hex');
|
|
39
|
+
return await ed25519.verify(signatureBuffer, dataBuffer, publicKeyBuffer);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Hash data using SHA-256
|
|
47
|
+
*/
|
|
48
|
+
static hash(data) {
|
|
49
|
+
const dataBuffer = typeof data === 'string' ? Buffer.from(data, 'utf8') : data;
|
|
50
|
+
const hash = sha256(dataBuffer);
|
|
51
|
+
return Buffer.from(hash).toString('hex');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Generate cryptographically secure random bytes
|
|
55
|
+
*/
|
|
56
|
+
static randomBytes(length) {
|
|
57
|
+
return randomBytes(length);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Generate a secure random string
|
|
61
|
+
*/
|
|
62
|
+
static randomString(length = 32) {
|
|
63
|
+
return randomBytes(Math.ceil(length / 2)).toString('hex').slice(0, length);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Derive key from password using a simple key derivation
|
|
67
|
+
*/
|
|
68
|
+
static deriveKey(password, salt) {
|
|
69
|
+
const combined = password + salt;
|
|
70
|
+
return this.hash(combined);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a fingerprint from public key
|
|
74
|
+
*/
|
|
75
|
+
static createKeyFingerprint(publicKey) {
|
|
76
|
+
const hash = this.hash(publicKey);
|
|
77
|
+
// Return first 16 characters for a shorter fingerprint
|
|
78
|
+
return hash.slice(0, 16);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Validate hex string
|
|
82
|
+
*/
|
|
83
|
+
static isValidHex(hex) {
|
|
84
|
+
return /^[0-9a-fA-F]+$/.test(hex) && hex.length % 2 === 0;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Constant-time string comparison
|
|
88
|
+
*/
|
|
89
|
+
static constantTimeEqual(a, b) {
|
|
90
|
+
if (a.length !== b.length) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
let result = 0;
|
|
94
|
+
for (let i = 0; i < a.length; i++) {
|
|
95
|
+
result |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
96
|
+
}
|
|
97
|
+
return result === 0;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"did.d.ts","sourceRoot":"","sources":["../../src/utils/did.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAsB,MAAM,aAAa,CAAC;AAE9D;;GAEG;AACH,qBAAa,QAAQ;IACnB;;OAEG;WACU,WAAW,CAAC,OAAO,CAAC,EAAE;QACjC,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;QAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC;QACV,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,WAAW,CAAC;QACtB,OAAO,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,CAAC;KACpD,CAAC;IA8BF;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;QAC5B,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI;IAgBR;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIvC;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IA0B7E;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAC1B,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,CAAC,gBAAgB,GAAG,iBAAiB,GAAG,cAAc,GAAG,sBAAsB,GAAG,sBAAsB,CAAC,EAAuB,GACzI,WAAW;IAyBd;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAC3B,QAAQ,EAAE,WAAW,EACrB,QAAQ,CAAC,EAAE,GAAG,GACb;QACD,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,WAAW,CAAC;QACzB,mBAAmB,EAAE,GAAG,CAAC;QACzB,qBAAqB,EAAE,GAAG,CAAC;KAC5B;IAeD;;OAEG;WACU,eAAe,CAC1B,QAAQ,EAAE,WAAW,EACrB,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC;IAoBvB;;OAEG;WACU,iBAAiB,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBvE;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAC1B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM;;;;;IASzB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAO9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAS9B;;OAEG;IACH,MAAM,CAAC,gBAAgB,CACrB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GACA,MAAM;IAQT;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,GAAG,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;CAoChF"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { CryptoUtils } from './crypto.js';
|
|
2
|
+
/**
|
|
3
|
+
* DID utilities for ATP™ SDK
|
|
4
|
+
*/
|
|
5
|
+
export class DIDUtils {
|
|
6
|
+
/**
|
|
7
|
+
* Generate a new ATP DID
|
|
8
|
+
*/
|
|
9
|
+
static async generateDID(options) {
|
|
10
|
+
const network = options?.network || 'mainnet';
|
|
11
|
+
const method = options?.method || 'atp';
|
|
12
|
+
const keyPair = await CryptoUtils.generateKeyPair();
|
|
13
|
+
const fingerprint = CryptoUtils.createKeyFingerprint(keyPair.publicKey);
|
|
14
|
+
const did = `did:${method}:${network}:${fingerprint}`;
|
|
15
|
+
const document = {
|
|
16
|
+
id: did,
|
|
17
|
+
'@context': ['https://www.w3.org/ns/did/v1'],
|
|
18
|
+
verificationMethod: [{
|
|
19
|
+
id: `${did}#key-1`,
|
|
20
|
+
type: 'Ed25519VerificationKey2020',
|
|
21
|
+
controller: did,
|
|
22
|
+
publicKeyMultibase: this.encodeMultibase(keyPair.publicKey)
|
|
23
|
+
}],
|
|
24
|
+
authentication: [`${did}#key-1`],
|
|
25
|
+
assertionMethod: [`${did}#key-1`],
|
|
26
|
+
keyAgreement: [`${did}#key-1`]
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
did,
|
|
30
|
+
document,
|
|
31
|
+
keyPair
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Parse a DID string
|
|
36
|
+
*/
|
|
37
|
+
static parseDID(did) {
|
|
38
|
+
const didRegex = /^did:([^:]+):([^:]+):([^#]+)(?:#(.+))?$/;
|
|
39
|
+
const match = did.match(didRegex);
|
|
40
|
+
if (!match) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
method: match[1],
|
|
45
|
+
network: match[2],
|
|
46
|
+
identifier: match[3],
|
|
47
|
+
fragment: match[4]
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Validate DID format
|
|
52
|
+
*/
|
|
53
|
+
static isValidDID(did) {
|
|
54
|
+
return this.parseDID(did) !== null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Extract public key from DID document
|
|
58
|
+
*/
|
|
59
|
+
static extractPublicKey(document, keyId) {
|
|
60
|
+
const targetKeyId = keyId || `${document.id}#key-1`;
|
|
61
|
+
const verificationMethod = document.verificationMethod?.find(vm => vm.id === targetKeyId);
|
|
62
|
+
if (!verificationMethod) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
if (verificationMethod.publicKeyMultibase) {
|
|
66
|
+
return this.decodeMultibase(verificationMethod.publicKeyMultibase);
|
|
67
|
+
}
|
|
68
|
+
if (verificationMethod.publicKeyJwk) {
|
|
69
|
+
// Convert JWK to hex (simplified)
|
|
70
|
+
const jwk = verificationMethod.publicKeyJwk;
|
|
71
|
+
if (jwk.x) {
|
|
72
|
+
return Buffer.from(jwk.x, 'base64url').toString('hex');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Add verification method to DID document
|
|
79
|
+
*/
|
|
80
|
+
static addVerificationMethod(document, publicKey, purposes = ['authentication']) {
|
|
81
|
+
const keyNumber = document.verificationMethod.length + 1;
|
|
82
|
+
const keyId = `${document.id}#key-${keyNumber}`;
|
|
83
|
+
const verificationMethod = {
|
|
84
|
+
id: keyId,
|
|
85
|
+
type: 'Ed25519VerificationKey2020',
|
|
86
|
+
controller: document.id,
|
|
87
|
+
publicKeyMultibase: this.encodeMultibase(publicKey)
|
|
88
|
+
};
|
|
89
|
+
const updatedDocument = { ...document };
|
|
90
|
+
updatedDocument.verificationMethod = [...document.verificationMethod, verificationMethod];
|
|
91
|
+
// Add to specified purposes
|
|
92
|
+
purposes.forEach(purpose => {
|
|
93
|
+
if (!updatedDocument[purpose]) {
|
|
94
|
+
updatedDocument[purpose] = [];
|
|
95
|
+
}
|
|
96
|
+
updatedDocument[purpose].push(keyId);
|
|
97
|
+
});
|
|
98
|
+
return updatedDocument;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Create DID resolution result
|
|
102
|
+
*/
|
|
103
|
+
static createResolutionResult(document, metadata) {
|
|
104
|
+
return {
|
|
105
|
+
'@context': 'https://w3id.org/did-resolution/v1',
|
|
106
|
+
didDocument: document,
|
|
107
|
+
didDocumentMetadata: {
|
|
108
|
+
created: new Date().toISOString(),
|
|
109
|
+
updated: new Date().toISOString(),
|
|
110
|
+
...metadata
|
|
111
|
+
},
|
|
112
|
+
didResolutionMetadata: {
|
|
113
|
+
contentType: 'application/did+ld+json'
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Sign DID document
|
|
119
|
+
*/
|
|
120
|
+
static async signDIDDocument(document, privateKey, keyId) {
|
|
121
|
+
const targetKeyId = keyId || `${document.id}#key-1`;
|
|
122
|
+
const documentJson = JSON.stringify(document, null, 2);
|
|
123
|
+
const signature = await CryptoUtils.signData(documentJson, privateKey);
|
|
124
|
+
// Add proof to document
|
|
125
|
+
const signedDocument = {
|
|
126
|
+
...document,
|
|
127
|
+
proof: {
|
|
128
|
+
type: 'Ed25519Signature2020',
|
|
129
|
+
created: new Date().toISOString(),
|
|
130
|
+
verificationMethod: targetKeyId,
|
|
131
|
+
proofPurpose: 'assertionMethod',
|
|
132
|
+
proofValue: signature
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
return signedDocument;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Verify DID document signature
|
|
139
|
+
*/
|
|
140
|
+
static async verifyDIDDocument(document) {
|
|
141
|
+
if (!document.proof) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
const { proof, ...documentWithoutProof } = document;
|
|
145
|
+
const publicKey = this.extractPublicKey(document, proof.verificationMethod);
|
|
146
|
+
if (!publicKey) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
const documentJson = JSON.stringify(documentWithoutProof, null, 2);
|
|
150
|
+
return CryptoUtils.verifySignature(documentJson, proof.proofValue, publicKey);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Create service endpoint
|
|
154
|
+
*/
|
|
155
|
+
static createServiceEndpoint(id, type, serviceEndpoint) {
|
|
156
|
+
return {
|
|
157
|
+
id,
|
|
158
|
+
type,
|
|
159
|
+
serviceEndpoint
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Encode public key as multibase
|
|
164
|
+
*/
|
|
165
|
+
static encodeMultibase(publicKeyHex) {
|
|
166
|
+
// Simplified multibase encoding (base58btc)
|
|
167
|
+
const publicKeyBuffer = Buffer.from(publicKeyHex, 'hex');
|
|
168
|
+
// In a real implementation, this would use proper multibase encoding
|
|
169
|
+
return 'z' + publicKeyBuffer.toString('base64url');
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Decode multibase public key
|
|
173
|
+
*/
|
|
174
|
+
static decodeMultibase(multibase) {
|
|
175
|
+
// Simplified multibase decoding
|
|
176
|
+
if (multibase.startsWith('z')) {
|
|
177
|
+
const base64url = multibase.slice(1);
|
|
178
|
+
return Buffer.from(base64url, 'base64url').toString('hex');
|
|
179
|
+
}
|
|
180
|
+
throw new Error('Unsupported multibase encoding');
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Generate DID from public key
|
|
184
|
+
*/
|
|
185
|
+
static didFromPublicKey(publicKey, options) {
|
|
186
|
+
const network = options?.network || 'mainnet';
|
|
187
|
+
const method = options?.method || 'atp';
|
|
188
|
+
const fingerprint = CryptoUtils.createKeyFingerprint(publicKey);
|
|
189
|
+
return `did:${method}:${network}:${fingerprint}`;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Validate DID document structure
|
|
193
|
+
*/
|
|
194
|
+
static validateDIDDocument(document) {
|
|
195
|
+
const errors = [];
|
|
196
|
+
if (!document.id || typeof document.id !== 'string') {
|
|
197
|
+
errors.push('Missing or invalid id');
|
|
198
|
+
}
|
|
199
|
+
if (!document['@context'] || !Array.isArray(document['@context'])) {
|
|
200
|
+
errors.push('Missing or invalid @context');
|
|
201
|
+
}
|
|
202
|
+
if (!document.verificationMethod || !Array.isArray(document.verificationMethod)) {
|
|
203
|
+
errors.push('Missing or invalid verificationMethod');
|
|
204
|
+
}
|
|
205
|
+
if (!document.authentication || !Array.isArray(document.authentication)) {
|
|
206
|
+
errors.push('Missing or invalid authentication');
|
|
207
|
+
}
|
|
208
|
+
// Validate verification methods
|
|
209
|
+
if (document.verificationMethod) {
|
|
210
|
+
document.verificationMethod.forEach((vm, index) => {
|
|
211
|
+
if (!vm.id || !vm.type || !vm.controller) {
|
|
212
|
+
errors.push(`Invalid verification method at index ${index}`);
|
|
213
|
+
}
|
|
214
|
+
if (!vm.publicKeyMultibase && !vm.publicKeyJwk) {
|
|
215
|
+
errors.push(`Missing public key in verification method at index ${index}`);
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
valid: errors.length === 0,
|
|
221
|
+
errors
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=did.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"did.js","sourceRoot":"","sources":["../../src/utils/did.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/utils/jwt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { SignJWT, jwtVerify } from 'jose';
|
|
2
|
+
/**
|
|
3
|
+
* JWT utilities for ATP™ SDK
|
|
4
|
+
*/
|
|
5
|
+
export class JWTUtils {
|
|
6
|
+
/**
|
|
7
|
+
* Create a DID-JWT token
|
|
8
|
+
*/
|
|
9
|
+
static async createDIDJWT(payload, privateKey, did, options) {
|
|
10
|
+
const privateKeyBuffer = Buffer.from(privateKey, 'hex');
|
|
11
|
+
const jwt = new SignJWT({
|
|
12
|
+
...payload,
|
|
13
|
+
iss: options?.issuer || did,
|
|
14
|
+
sub: did,
|
|
15
|
+
aud: options?.audience || 'atp:services'
|
|
16
|
+
})
|
|
17
|
+
.setProtectedHeader({
|
|
18
|
+
alg: 'EdDSA',
|
|
19
|
+
typ: 'JWT',
|
|
20
|
+
kid: `${did}#key-1`
|
|
21
|
+
})
|
|
22
|
+
.setIssuedAt();
|
|
23
|
+
if (options?.expiresIn) {
|
|
24
|
+
if (typeof options.expiresIn === 'string') {
|
|
25
|
+
jwt.setExpirationTime(options.expiresIn);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
jwt.setExpirationTime(Math.floor(Date.now() / 1000) + options.expiresIn);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
jwt.setExpirationTime('1h'); // Default 1 hour
|
|
33
|
+
}
|
|
34
|
+
return jwt.sign(privateKeyBuffer);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Verify a DID-JWT token
|
|
38
|
+
*/
|
|
39
|
+
static async verifyDIDJWT(token, publicKey, options) {
|
|
40
|
+
try {
|
|
41
|
+
const publicKeyBuffer = Buffer.from(publicKey, 'hex');
|
|
42
|
+
const { payload } = await jwtVerify(token, publicKeyBuffer, {
|
|
43
|
+
audience: options?.audience,
|
|
44
|
+
issuer: options?.issuer,
|
|
45
|
+
clockTolerance: options?.clockTolerance || 30 // 30 seconds
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
valid: true,
|
|
49
|
+
payload
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
return {
|
|
54
|
+
valid: false,
|
|
55
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Decode JWT without verification
|
|
61
|
+
*/
|
|
62
|
+
static decodeJWT(token) {
|
|
63
|
+
try {
|
|
64
|
+
const parts = token.split('.');
|
|
65
|
+
if (parts.length !== 3) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const header = JSON.parse(Buffer.from(parts[0], 'base64url').toString());
|
|
69
|
+
const payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString());
|
|
70
|
+
const signature = parts[2];
|
|
71
|
+
return { header, payload, signature };
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check if JWT is expired
|
|
79
|
+
*/
|
|
80
|
+
static isExpired(token) {
|
|
81
|
+
const decoded = this.decodeJWT(token);
|
|
82
|
+
if (!decoded || !decoded.payload.exp) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
const now = Math.floor(Date.now() / 1000);
|
|
86
|
+
return decoded.payload.exp < now;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get time until expiration in seconds
|
|
90
|
+
*/
|
|
91
|
+
static getTimeToExpiration(token) {
|
|
92
|
+
const decoded = this.decodeJWT(token);
|
|
93
|
+
if (!decoded || !decoded.payload.exp) {
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
const now = Math.floor(Date.now() / 1000);
|
|
97
|
+
return Math.max(0, decoded.payload.exp - now);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Create authentication token for ATP services
|
|
101
|
+
*/
|
|
102
|
+
static async createAuthToken(did, privateKey, options) {
|
|
103
|
+
const payload = {
|
|
104
|
+
did,
|
|
105
|
+
permissions: options?.permissions || [],
|
|
106
|
+
trustLevel: options?.trustLevel || 'BASIC'
|
|
107
|
+
};
|
|
108
|
+
return this.createDIDJWT(payload, privateKey, did, {
|
|
109
|
+
audience: options?.audience || 'atp:services',
|
|
110
|
+
expiresIn: options?.expiresIn || '1h'
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Create capability token
|
|
115
|
+
*/
|
|
116
|
+
static async createCapabilityToken(issuer, subject, capabilities, privateKey, options) {
|
|
117
|
+
const payload = {
|
|
118
|
+
sub: subject,
|
|
119
|
+
capabilities,
|
|
120
|
+
restrictions: options?.restrictions,
|
|
121
|
+
tokenType: 'capability'
|
|
122
|
+
};
|
|
123
|
+
return this.createDIDJWT(payload, privateKey, issuer, {
|
|
124
|
+
audience: options?.audience || 'atp:services',
|
|
125
|
+
expiresIn: options?.expiresIn || '24h'
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Verify capability token
|
|
130
|
+
*/
|
|
131
|
+
static async verifyCapabilityToken(token, publicKey, requiredCapability) {
|
|
132
|
+
const result = await this.verifyDIDJWT(token, publicKey);
|
|
133
|
+
if (!result.valid) {
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
136
|
+
const payload = result.payload;
|
|
137
|
+
if (payload.tokenType !== 'capability') {
|
|
138
|
+
return {
|
|
139
|
+
valid: false,
|
|
140
|
+
error: 'Not a capability token'
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
const capabilities = payload.capabilities || [];
|
|
144
|
+
if (requiredCapability && !capabilities.includes(requiredCapability)) {
|
|
145
|
+
return {
|
|
146
|
+
valid: false,
|
|
147
|
+
error: `Missing required capability: ${requiredCapability}`
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
valid: true,
|
|
152
|
+
capabilities,
|
|
153
|
+
subject: payload.sub,
|
|
154
|
+
restrictions: payload.restrictions
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Create presentation token for verifiable credentials
|
|
159
|
+
*/
|
|
160
|
+
static async createPresentationToken(holder, audience, credentialIds, privateKey, options) {
|
|
161
|
+
const payload = {
|
|
162
|
+
vp: {
|
|
163
|
+
'@context': ['https://www.w3.org/2018/credentials/v1'],
|
|
164
|
+
type: ['VerifiablePresentation'],
|
|
165
|
+
verifiableCredential: credentialIds,
|
|
166
|
+
holder
|
|
167
|
+
},
|
|
168
|
+
challenge: options?.challenge,
|
|
169
|
+
tokenType: 'presentation'
|
|
170
|
+
};
|
|
171
|
+
return this.createDIDJWT(payload, privateKey, holder, {
|
|
172
|
+
audience,
|
|
173
|
+
expiresIn: options?.expiresIn || '15m'
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Extract DID from JWT token
|
|
178
|
+
*/
|
|
179
|
+
static extractDID(token) {
|
|
180
|
+
const decoded = this.decodeJWT(token);
|
|
181
|
+
return decoded?.payload?.iss || decoded?.payload?.sub || null;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Extract trust level from JWT token
|
|
185
|
+
*/
|
|
186
|
+
static extractTrustLevel(token) {
|
|
187
|
+
const decoded = this.decodeJWT(token);
|
|
188
|
+
return decoded?.payload?.trustLevel || null;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Extract permissions from JWT token
|
|
192
|
+
*/
|
|
193
|
+
static extractPermissions(token) {
|
|
194
|
+
const decoded = this.decodeJWT(token);
|
|
195
|
+
return decoded?.payload?.permissions || [];
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Create refresh token
|
|
199
|
+
*/
|
|
200
|
+
static async createRefreshToken(did, privateKey, tokenId, options) {
|
|
201
|
+
const payload = {
|
|
202
|
+
tokenType: 'refresh',
|
|
203
|
+
jti: tokenId,
|
|
204
|
+
scope: 'refresh'
|
|
205
|
+
};
|
|
206
|
+
return this.createDIDJWT(payload, privateKey, did, {
|
|
207
|
+
audience: 'atp:auth',
|
|
208
|
+
expiresIn: options?.expiresIn || '30d'
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Verify refresh token
|
|
213
|
+
*/
|
|
214
|
+
static async verifyRefreshToken(token, publicKey) {
|
|
215
|
+
const result = await this.verifyDIDJWT(token, publicKey, {
|
|
216
|
+
audience: 'atp:auth'
|
|
217
|
+
});
|
|
218
|
+
if (!result.valid) {
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
const payload = result.payload;
|
|
222
|
+
if (payload.tokenType !== 'refresh') {
|
|
223
|
+
return {
|
|
224
|
+
valid: false,
|
|
225
|
+
error: 'Not a refresh token'
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
valid: true,
|
|
230
|
+
tokenId: payload.jti,
|
|
231
|
+
did: payload.iss
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=jwt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/utils/jwt.ts"],"names":[],"mappings":"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"}
|