@blod-nm/ak 0.0.0-stage → 0.1.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.
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Web Crypto 封装 —— 唯一的运行时依赖面。
3
+ * 不 import node:crypto,因此在 Node 18+ / Bun / Deno /
4
+ * Cloudflare Workers / Vercel Edge 全部原生可用。
5
+ * Web Crypto 全异步,这是本包所有核心方法为 async 的唯一原因。
6
+ */
7
+ export declare function toBytes(value: string | Uint8Array): Uint8Array;
8
+ export declare function randomBytes(length: number): Uint8Array;
9
+ export declare function hmacSha256(key: Uint8Array, data: Uint8Array): Promise<Uint8Array>;
10
+ export declare function hkdfSha256(ikm: Uint8Array, info: string, length?: number): Promise<Uint8Array>;
11
+ /**
12
+ * 恒时比较(手写,不依赖 crypto.timingSafeEqual):
13
+ * 异或折叠所有字节,无论内容如何耗时一致,不泄露比较进度。
14
+ * 长度不同时仍完整跑一遍以抹平时序差异。
15
+ */
16
+ export declare function timingSafeEqual(a: Uint8Array, b: Uint8Array): boolean;
17
+ export declare function toHex(bytes: Uint8Array): string;
18
+ export declare function b64uEncode(bytes: Uint8Array): string;
19
+ export declare function b64uDecode(text: string): Uint8Array;
20
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAE9D;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAEtD;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CASvF;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,MAAM,EACZ,MAAM,SAAK,GACV,OAAO,CAAC,UAAU,CAAC,CAerB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAOrE;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAI/C;AAMD,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAYpD;AAMD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAiBnD"}
package/dist/crypto.js ADDED
@@ -0,0 +1 @@
1
+ const _0x18867b=_0x4180;(function(_0x3cdb57,_0x46ac14){const _0x33f01a=_0x4180,_0x1c8867=_0x3cdb57();while(!![]){try{const _0x1965da=-parseInt(_0x33f01a(0x13f))/0x1*(-parseInt(_0x33f01a(0x151))/0x2)+-parseInt(_0x33f01a(0x156))/0x3+parseInt(_0x33f01a(0x134))/0x4*(-parseInt(_0x33f01a(0x142))/0x5)+-parseInt(_0x33f01a(0x133))/0x6+parseInt(_0x33f01a(0x14d))/0x7+parseInt(_0x33f01a(0x15a))/0x8*(-parseInt(_0x33f01a(0x15c))/0x9)+parseInt(_0x33f01a(0x153))/0xa;if(_0x1965da===_0x46ac14)break;else _0x1c8867['push'](_0x1c8867['shift']());}catch(_0x122aed){_0x1c8867['push'](_0x1c8867['shift']());}}}(_0x4ea5,0xf0022));const encoder=new TextEncoder();function asBufferSource(_0x59b2b7){return _0x59b2b7;}export function toBytes(_0xb0ce9c){const _0x3e2921=_0x4180,_0xf59215={};_0xf59215['GOhPy']=_0x3e2921(0x159);const _0x1b76ce=_0xf59215;return typeof _0xb0ce9c===_0x1b76ce[_0x3e2921(0x13a)]?encoder[_0x3e2921(0x14c)](_0xb0ce9c):_0xb0ce9c;}export function randomBytes(_0x11eebe){return crypto['getRandomValues'](new Uint8Array(_0x11eebe));}export async function hmacSha256(_0x4567ed,_0x288fa7){const _0x482f3b=_0x4180,_0x2607e2={'QhylY':function(_0x373459,_0x5a531a){return _0x373459(_0x5a531a);},'hLlcX':'sign','fnsaS':'HMAC'},_0x56b5f4={};_0x56b5f4['name']=_0x482f3b(0x148),_0x56b5f4[_0x482f3b(0x139)]=_0x482f3b(0x146);const _0x2450f7=await crypto[_0x482f3b(0x144)]['importKey']('raw',_0x2607e2[_0x482f3b(0x145)](asBufferSource,_0x4567ed),_0x56b5f4,![],[_0x2607e2[_0x482f3b(0x14f)]]);return new Uint8Array(await crypto[_0x482f3b(0x144)]['sign'](_0x2607e2[_0x482f3b(0x138)],_0x2450f7,_0x2607e2[_0x482f3b(0x145)](asBufferSource,_0x288fa7)));}function _0x4ea5(){const _0x6ec9c0=['mtK3nZC4mtb1EfvHz1m','uunoyum','rKr3r2K','nti0odu5EuLPELLK','zNjVBuvUDhjPzxm','DLPUseu','C3rYAw5N','mta0vLHZBhj6','uKvADg8','otC4nJG3tg9YsLPu','uxDqEg4','nta5nZyXmKnjBxffCW','mtK4nJK4ogPPs3jwBa','CMvWBgfJzq','vuvUzwu','CMf3','zM5Zyvm','AgfZAa','r09OuhK','A05lv3y','BgvUz3rO','Aw1WB3j0s2v5','vfLez0e','nZj1thH6CK0','seTerG','vfnSEKq','mtvgz3fgCKK','t1jLsvq','C3vIDgXL','uwH5BfK','u0Hblti1nG','BwfW','se1bqW','zMXVB3i','svnKA0W','t3LKzgi','zw5JB2rL','mti4nJKZodHAre1Oqvu','C3bSAxq','AeXSy1G','y1fSt1u','mZa0mJrovhntuLe','zgvYAxzLqML0CW'];_0x4ea5=function(){return _0x6ec9c0;};return _0x4ea5();}export async function hkdfSha256(_0x5a46a1,_0xa14057,_0x433a0d=0x20){const _0x4e5e43=_0x4180,_0x65f14f={};_0x65f14f[_0x4e5e43(0x15d)]=_0x4e5e43(0x137),_0x65f14f[_0x4e5e43(0x14a)]=_0x4e5e43(0x146);const _0x19485e=_0x65f14f,_0x340697=await crypto[_0x4e5e43(0x144)][_0x4e5e43(0x13d)](_0x19485e[_0x4e5e43(0x15d)],asBufferSource(_0x5a46a1),_0x4e5e43(0x140),![],['deriveBits']),_0x45c65=await crypto['subtle'][_0x4e5e43(0x152)]({'name':_0x4e5e43(0x140),'hash':_0x19485e[_0x4e5e43(0x14a)],'salt':new Uint8Array(0x0),'info':encoder['encode'](_0xa14057)},_0x340697,_0x433a0d*0x8);return new Uint8Array(_0x45c65);}export function timingSafeEqual(_0x1bcfdd,_0x1e1ebb){const _0x4ee535=_0x4180,_0x1986de={};_0x1986de[_0x4ee535(0x150)]=function(_0x50d8ae,_0x590af5){return _0x50d8ae^_0x590af5;},_0x1986de[_0x4ee535(0x13b)]=function(_0x8aebf6,_0x2e2d1b){return _0x8aebf6%_0x2e2d1b;};const _0x1dece2=_0x1986de,_0x93e929=Math['max'](_0x1bcfdd['length'],_0x1e1ebb[_0x4ee535(0x13c)]);let _0x39ca71=_0x1dece2[_0x4ee535(0x150)](_0x1bcfdd[_0x4ee535(0x13c)],_0x1e1ebb['length']);for(let _0x538f2f=0x0;_0x538f2f<_0x93e929;_0x538f2f++){_0x39ca71|=(_0x1bcfdd[_0x1dece2['kNKWv'](_0x538f2f,_0x1bcfdd[_0x4ee535(0x13c)])]??0x0)^(_0x1e1ebb[_0x1dece2['kNKWv'](_0x538f2f,_0x1e1ebb[_0x4ee535(0x13c)])]??0x0);}return _0x39ca71===0x0;}export function toHex(_0x4fd4c9){let _0x423bee='';for(const _0x27096b of _0x4fd4c9)_0x423bee+=_0x27096b['toString'](0x10)['padStart'](0x2,'0');return _0x423bee;}const B64_ALPHABET='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';export function b64uEncode(_0x252da3){const _0x3e1c27=_0x4180,_0x34deca={};_0x34deca[_0x3e1c27(0x155)]=function(_0x17f414,_0x9666dc){return _0x17f414+_0x9666dc;},_0x34deca[_0x3e1c27(0x143)]=function(_0x29a881,_0x146ba5){return _0x29a881>>_0x146ba5;},_0x34deca[_0x3e1c27(0x15b)]=function(_0x5d3671,_0x126922){return _0x5d3671|_0x126922;},_0x34deca[_0x3e1c27(0x13e)]=function(_0x1b26b8,_0x47187c){return _0x1b26b8&_0x47187c;},_0x34deca[_0x3e1c27(0x136)]=function(_0x3ae38a,_0x510804){return _0x3ae38a??_0x510804;},_0x34deca['QCNaC']=function(_0x4720ef,_0x5624d8){return _0x4720ef??_0x5624d8;};const _0x2adda4=_0x34deca;let _0x5b84ea='';for(let _0x1e3afa=0x0;_0x1e3afa<_0x252da3['length'];_0x1e3afa+=0x3){const _0x4a8b60=_0x252da3[_0x1e3afa],_0x17d6bb=_0x252da3[_0x1e3afa+0x1],_0x4acd85=_0x252da3[_0x2adda4[_0x3e1c27(0x155)](_0x1e3afa,0x2)];_0x5b84ea+=B64_ALPHABET[_0x2adda4[_0x3e1c27(0x143)](_0x4a8b60,0x2)],_0x5b84ea+=B64_ALPHABET[_0x2adda4[_0x3e1c27(0x15b)](_0x2adda4[_0x3e1c27(0x13e)](_0x4a8b60,0x3)<<0x4,_0x2adda4[_0x3e1c27(0x136)](_0x17d6bb,0x0)>>0x4)],_0x5b84ea+=_0x17d6bb===undefined?'':B64_ALPHABET[_0x2adda4['REZto'](_0x2adda4[_0x3e1c27(0x13e)](_0x17d6bb,0xf)<<0x2,_0x2adda4[_0x3e1c27(0x154)](_0x4acd85,0x0)>>0x6)],_0x5b84ea+=_0x4acd85===undefined?'':B64_ALPHABET[_0x4acd85&0x3f];}return _0x5b84ea;}const B64_LOOKUP=Object[_0x18867b(0x157)](B64_ALPHABET[_0x18867b(0x14e)]('')[_0x18867b(0x147)]((_0x4ede9a,_0x36634e)=>[_0x4ede9a,_0x36634e]));function _0x4180(_0x3ba70f,_0x355e39){_0x3ba70f=_0x3ba70f-0x133;const _0x4ea56e=_0x4ea5();let _0x418003=_0x4ea56e[_0x3ba70f];if(_0x4180['jpObfK']===undefined){var _0xbf34a2=function(_0x3ad060){const _0x4f89f1='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2bc9e5='',_0x4f3cad='';for(let _0x3ec0ea=0x0,_0x502a9b,_0x50dc23,_0x16c2fc=0x0;_0x50dc23=_0x3ad060['charAt'](_0x16c2fc++);~_0x50dc23&&(_0x502a9b=_0x3ec0ea%0x4?_0x502a9b*0x40+_0x50dc23:_0x50dc23,_0x3ec0ea++%0x4)?_0x2bc9e5+=String['fromCharCode'](0xff&_0x502a9b>>(-0x2*_0x3ec0ea&0x6)):0x0){_0x50dc23=_0x4f89f1['indexOf'](_0x50dc23);}for(let _0x25c085=0x0,_0x3412a7=_0x2bc9e5['length'];_0x25c085<_0x3412a7;_0x25c085++){_0x4f3cad+='%'+('00'+_0x2bc9e5['charCodeAt'](_0x25c085)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4f3cad);};_0x4180['FIXBqi']=_0xbf34a2,_0x4180['dCzJbH']={},_0x4180['jpObfK']=!![];}const _0x987ed=_0x4ea56e[0x0],_0x3732c2=_0x3ba70f+_0x987ed,_0x1147ff=_0x4180['dCzJbH'][_0x3732c2];return!_0x1147ff?(_0x418003=_0x4180['FIXBqi'](_0x418003),_0x4180['dCzJbH'][_0x3732c2]=_0x418003):_0x418003=_0x1147ff,_0x418003;}export function b64uDecode(_0x5d674a){const _0xe67eab=_0x18867b,_0x1d6035={};_0x1d6035[_0xe67eab(0x14b)]=function(_0x867fb2,_0x1b71d9){return _0x867fb2*_0x1b71d9;},_0x1d6035[_0xe67eab(0x158)]=function(_0xa32879,_0x251223){return _0xa32879===_0x251223;},_0x1d6035['TSlzD']=function(_0x38df3e,_0xdbb026){return _0x38df3e|_0xdbb026;};const _0x15a2ce=_0x1d6035,_0x503095=_0x5d674a[_0xe67eab(0x135)](/=+$/,''),_0x372d0a=new Uint8Array(Math[_0xe67eab(0x149)](_0x15a2ce[_0xe67eab(0x14b)](_0x503095[_0xe67eab(0x13c)],0x6)/0x8));let _0xcea02d=0x0,_0x3f5387=0x0,_0x274fec=0x0;for(const _0x436cf2 of _0x503095){const _0x2fb1f3=B64_LOOKUP[_0x436cf2];if(_0x15a2ce[_0xe67eab(0x158)](_0x2fb1f3,undefined))throw new Error('非法\x20base64url\x20字符:\x20'+_0x436cf2);_0x3f5387=_0x15a2ce[_0xe67eab(0x141)](_0x3f5387<<0x6,_0x2fb1f3),_0xcea02d+=0x6,_0xcea02d>=0x8&&(_0xcea02d-=0x8,_0x372d0a[_0x274fec++]=_0x3f5387>>_0xcea02d&0xff);}return _0x372d0a;}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * 纯算 access-key 核心 —— 公共 API 总出口。
3
+ *
4
+ * 签发: createIssuer({ masterSecret }) → issue / derive
5
+ * 验证: createVerifier({ masterSecret }) → verify
6
+ * 纯函数: parseAccessKey
7
+ *
8
+ * 零存储、零 I/O:key 生命周期只由 TTL 决定,
9
+ * 需要"全部作废"时轮换 master secret。
10
+ */
11
+ export { createIssuer, AccessKeyIssuer, AccessKeyError, type IssuerOptions, type IssueInput, type DeriveInput, type IssuedKey, type DerivedKey, } from './issuer.ts';
12
+ export { createVerifier, AccessKeyVerifier, type VerifierOptions, type VerifyResult, type VerifyFailureReason, type AccessKeyAuth, } from './verifier.ts';
13
+ export { parseAccessKey, type ParsedAccessKey, KEY_PREFIX, HEADER_SIZE, MAC_SIZE, MIN_TOKEN_SIZE, } from './wire.ts';
14
+ export { SCENES, SCENE_NONE, MAX_DEPTH, MAX_DATA_BYTES, sceneCode, sceneName, type Scene, } from './scopes.ts';
15
+ export { timingSafeEqual, toHex, b64uEncode, b64uDecode, randomBytes } from './crypto.ts';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,YAAY,EACZ,eAAe,EACf,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,aAAa,GACnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,cAAc,EACd,KAAK,eAAe,EACpB,UAAU,EACV,WAAW,EACX,QAAQ,EACR,cAAc,GACf,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,MAAM,EACN,UAAU,EACV,SAAS,EACT,cAAc,EACd,SAAS,EACT,SAAS,EACT,KAAK,KAAK,GACX,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ (function(_0x37db52,_0x2723bf){var _0x3114e6=_0x2293,_0x20883f=_0x37db52();while(!![]){try{var _0x1c9cda=parseInt(_0x3114e6(0x1d7))/0x1+-parseInt(_0x3114e6(0x1da))/0x2*(parseInt(_0x3114e6(0x1d0))/0x3)+-parseInt(_0x3114e6(0x1d2))/0x4+-parseInt(_0x3114e6(0x1d5))/0x5*(-parseInt(_0x3114e6(0x1d8))/0x6)+parseInt(_0x3114e6(0x1d3))/0x7*(-parseInt(_0x3114e6(0x1d6))/0x8)+parseInt(_0x3114e6(0x1d1))/0x9+parseInt(_0x3114e6(0x1d9))/0xa*(-parseInt(_0x3114e6(0x1d4))/0xb);if(_0x1c9cda===_0x2723bf)break;else _0x20883f['push'](_0x20883f['shift']());}catch(_0x90c103){_0x20883f['push'](_0x20883f['shift']());}}}(_0x5a59,0x48ddb));export{createIssuer,AccessKeyIssuer,AccessKeyError}from'./issuer.js';export{createVerifier,AccessKeyVerifier}from'./verifier.js';export{parseAccessKey,KEY_PREFIX,HEADER_SIZE,MAC_SIZE,MIN_TOKEN_SIZE}from'./wire.js';function _0x5a59(){var _0x1d5a50=['mteYnZDHBvbpwui','mty5ntf5C09KCxC','ntmWmtu1BvbhAKDK','mtaWofnbAhj3ua','nti2ndqYvxzWug9d','nMrnq1nlCG','ndeWs3v0Bfvr','mMDfC0Xrra','odC2odKXCeTJC09o','mZG3nZCZmwDMEvnKEG','odi1nJm2zfvSv3jI'];_0x5a59=function(){return _0x1d5a50;};return _0x5a59();}function _0x2293(_0x16fdd9,_0x2b4022){_0x16fdd9=_0x16fdd9-0x1d0;var _0x5a591a=_0x5a59();var _0x2293a5=_0x5a591a[_0x16fdd9];if(_0x2293['EcUzCj']===undefined){var _0xcb4c96=function(_0x48e49c){var _0x15619d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x150972='',_0x59bcf4='';for(var _0x185759=0x0,_0x1f3397,_0x382862,_0x1f7998=0x0;_0x382862=_0x48e49c['charAt'](_0x1f7998++);~_0x382862&&(_0x1f3397=_0x185759%0x4?_0x1f3397*0x40+_0x382862:_0x382862,_0x185759++%0x4)?_0x150972+=String['fromCharCode'](0xff&_0x1f3397>>(-0x2*_0x185759&0x6)):0x0){_0x382862=_0x15619d['indexOf'](_0x382862);}for(var _0x521a79=0x0,_0x1f8c30=_0x150972['length'];_0x521a79<_0x1f8c30;_0x521a79++){_0x59bcf4+='%'+('00'+_0x150972['charCodeAt'](_0x521a79)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x59bcf4);};_0x2293['xYEClM']=_0xcb4c96,_0x2293['UgCtCw']={},_0x2293['EcUzCj']=!![];}var _0x426b04=_0x5a591a[0x0],_0x4ccb40=_0x16fdd9+_0x426b04,_0x4f5561=_0x2293['UgCtCw'][_0x4ccb40];return!_0x4f5561?(_0x2293a5=_0x2293['xYEClM'](_0x2293a5),_0x2293['UgCtCw'][_0x4ccb40]=_0x2293a5):_0x2293a5=_0x4f5561,_0x2293a5;}export{SCENES,SCENE_NONE,MAX_DEPTH,MAX_DATA_BYTES,sceneCode,sceneName}from'./scopes.js';export{timingSafeEqual,toHex,b64uEncode,b64uDecode,randomBytes}from'./crypto.js';
@@ -0,0 +1,61 @@
1
+ /**
2
+ * 签发器:持 master secret,唯一能造出合法 key 的对象。
3
+ * 密钥派生全部走 HKDF 域分隔,不同用途互不泄露。
4
+ */
5
+ export interface IssuerOptions {
6
+ /** 主密钥,>= 32 字节。全系统唯一必须妥善保管的持久状态 */
7
+ masterSecret: string | Uint8Array;
8
+ /** 命名空间域分隔,多租户/多环境隔离用,默认 'ak' */
9
+ domain?: string;
10
+ }
11
+ export interface IssueInput {
12
+ uid: string;
13
+ /** 可选场景:内置名(api/mcp/...)或自定义名,空 = 无场景 */
14
+ scene?: string;
15
+ /** 内嵌携带数据(自由文本/字节,UTF-8,≤96B),可选 */
16
+ data?: string | Uint8Array;
17
+ /** 二选一:存活秒数 */
18
+ ttl?: number;
19
+ /** 二选一:过期 unix 秒 */
20
+ expiresAt?: number;
21
+ }
22
+ export interface DeriveInput {
23
+ /** 子 key 携带数据(缺省 = 继承父 key 的) */
24
+ data?: string | Uint8Array;
25
+ ttl?: number;
26
+ expiresAt?: number;
27
+ }
28
+ export interface IssuedKey {
29
+ /** 完整 key 明文,只在返回值出现一次,调用方负责交付 */
30
+ key: string;
31
+ keyId: string;
32
+ /** 前 11 字符,给 UI/日志做识别,不含敏感信息 */
33
+ keyPrefix: string;
34
+ expiresAt: number;
35
+ }
36
+ export interface DerivedKey extends IssuedKey {
37
+ depth: number;
38
+ }
39
+ export declare class AccessKeyError extends Error {
40
+ }
41
+ export declare class AccessKeyIssuer {
42
+ private readonly master;
43
+ private readonly domain;
44
+ private macKey;
45
+ private uidSalt;
46
+ private constructor();
47
+ static create(options: IssuerOptions): Promise<AccessKeyIssuer>;
48
+ /** uid → 8 字节截断哈希。盐来自 master,离线枚举 uid 不可行 */
49
+ uidRefOf(uid: string): Promise<Uint8Array>;
50
+ /** 签发一把新 key,明文只出现一次 */
51
+ issue(input: IssueInput): Promise<IssuedKey>;
52
+ /**
53
+ * 从父 key 派生子 key:时间取 min、深度 +1、数据缺省继承。
54
+ * 超过深度上限即 throw。
55
+ */
56
+ derive(parentKey: string, input?: DeriveInput): Promise<DerivedKey>;
57
+ private assemble;
58
+ private macMatches;
59
+ }
60
+ export declare function createIssuer(options: IssuerOptions): Promise<AccessKeyIssuer>;
61
+ //# sourceMappingURL=issuer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issuer.d.ts","sourceRoot":"","sources":["../src/issuer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,YAAY,EAAE,MAAM,GAAG,UAAU,CAAC;IAClC,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3B,eAAe;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oBAAoB;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAW,SAAQ,SAAS;IAC3C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,cAAe,SAAQ,KAAK;CAAG;AAI5C,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,OAAO,CAA2B;IAE1C,OAAO;WASM,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAOrE,6CAA6C;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAKhD,wBAAwB;IAClB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IAWlD;;;OAGG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;YA8B/D,QAAQ;YA4BR,UAAU;CAIzB;AA0BD,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAEnF"}
package/dist/issuer.js ADDED
@@ -0,0 +1 @@
1
+ const _0x1b1ee6=_0x2035;(function(_0x68f950,_0x1fb57b){const _0x60bafd=_0x2035,_0x1e4bcb=_0x68f950();while(!![]){try{const _0x47f316=parseInt(_0x60bafd(0xa9))/0x1*(parseInt(_0x60bafd(0xbc))/0x2)+-parseInt(_0x60bafd(0xb2))/0x3+parseInt(_0x60bafd(0xad))/0x4*(parseInt(_0x60bafd(0xac))/0x5)+parseInt(_0x60bafd(0xd0))/0x6*(parseInt(_0x60bafd(0xcf))/0x7)+parseInt(_0x60bafd(0xc8))/0x8*(-parseInt(_0x60bafd(0xa8))/0x9)+-parseInt(_0x60bafd(0xbd))/0xa+-parseInt(_0x60bafd(0xb8))/0xb*(-parseInt(_0x60bafd(0xc4))/0xc);if(_0x47f316===_0x1fb57b)break;else _0x1e4bcb['push'](_0x1e4bcb['shift']());}catch(_0x1a9e02){_0x1e4bcb['push'](_0x1e4bcb['shift']());}}}(_0x4144,0x83243));import{hmacSha256,hkdfSha256,randomBytes,toBytes,toHex,timingSafeEqual}from'./crypto.js';function _0x2035(_0x1a0462,_0x40f5bd){_0x1a0462=_0x1a0462-0xa7;const _0x414449=_0x4144();let _0x2035ed=_0x414449[_0x1a0462];if(_0x2035['cMlpLG']===undefined){var _0x549eb3=function(_0x5349e5){const _0x4ee1c0='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2057e7='',_0x4b17c4='';for(let _0xddd937=0x0,_0x5eab70,_0x135591,_0x5977f6=0x0;_0x135591=_0x5349e5['charAt'](_0x5977f6++);~_0x135591&&(_0x5eab70=_0xddd937%0x4?_0x5eab70*0x40+_0x135591:_0x135591,_0xddd937++%0x4)?_0x2057e7+=String['fromCharCode'](0xff&_0x5eab70>>(-0x2*_0xddd937&0x6)):0x0){_0x135591=_0x4ee1c0['indexOf'](_0x135591);}for(let _0x1325d2=0x0,_0xd770e4=_0x2057e7['length'];_0x1325d2<_0xd770e4;_0x1325d2++){_0x4b17c4+='%'+('00'+_0x2057e7['charCodeAt'](_0x1325d2)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4b17c4);};_0x2035['SVJfdh']=_0x549eb3,_0x2035['GTRYYG']={},_0x2035['cMlpLG']=!![];}const _0x217880=_0x414449[0x0],_0x54a51d=_0x1a0462+_0x217880,_0x160137=_0x2035['GTRYYG'][_0x54a51d];return!_0x160137?(_0x2035ed=_0x2035['SVJfdh'](_0x2035ed),_0x2035['GTRYYG'][_0x54a51d]=_0x2035ed):_0x2035ed=_0x160137,_0x2035ed;}import{encodeToken,parseAccessKey,HEADER_SIZE}from'./wire.js';import{MAX_DATA_BYTES,MAX_DEPTH,sceneCode}from'./scopes.js';export class AccessKeyError extends Error{}const textEncoder=new TextEncoder();function _0x4144(){const _0x17eb7a=['zw5JB2rL','DwH4v0S','ALrrAhC','zgf0yq','mJrLyw91tM0','DwLKuMvMt2y','C2XPy2u','AxnZDwu','ndCYnZe5mNfQqKPntG','zgvWDgG','DMD0vfu','EeHqC24','A2v5swq','5B+f6Ag75O+q5l6Bihr0BcdMIjyGzxHWAxjLC0f0ios5I+s4Ga','oNyX','n0z2EMrbvG','ndqWmJy2mK5yqvzyra','DwLK','BwfZDgvY','y3jLyxrL','BwfZDgvYu2vJCMv0ioIhS+wWKsaZmIdLRzFOIOi','54I2igTLEsdML6dMS5xOP6pMNPa','yNvMzMvY','DhrS','uhn4rhG','BgvUz3rO','A1HKug4','yxnZzw1IBgu','oNvPzhjLzG','BwfZDgvYu2vJCMv0','ywnJzxnZlwTLEtO','BM93','sxHNq3y','ouHcENHgCq','nJa2nZu5D0vRzeDh','DwLKuMvM','uKzLA1u','mJi1mdy1z1juCuDL','mJHHs0XdsuO','DwLKu2fSDa','BwfJs2v5','DhrSios4JIbLEhbPCMvZqxqG5y+Q6io95lQm6ycj5lIa','yMroqLK','ntyYntKZsxDKDxLJ','zg9TywLU','DhrSiow/HEMHU+s4UUATO+AvSa','zxHWAxjLC0f0','BujXAvK','iowTL+IkGIJLVzpLIy0G','mte5ote3nKXnrfbVvW','zMXVB3i','u3z6sfK','C2nLBMu','mLvmugDrvG','ntu4mdC0mg1sreDWtq','C2v0','BwfJtwf0y2HLCW'];_0x4144=function(){return _0x17eb7a;};return _0x4144();}export class AccessKeyIssuer{[_0x1b1ee6(0xd2)];['domain'];['macKey']=null;[_0x1b1ee6(0xae)]=null;constructor(_0x39a698){const _0xe0484f=_0x1b1ee6,_0x242c43={'QUbJf':function(_0x248e6c,_0x5c68e9){return _0x248e6c(_0x5c68e9);},'UNGXv':function(_0x337956,_0x3be407){return _0x337956<_0x3be407;},'vgtTU':_0xe0484f(0xd4)},_0x3554eb=_0x242c43['QUbJf'](toBytes,_0x39a698[_0xe0484f(0xdd)]);if(_0x242c43['UNGXv'](_0x3554eb[_0xe0484f(0xd9)],0x20))throw new AccessKeyError(_0x242c43[_0xe0484f(0xca)]);this[_0xe0484f(0xd2)]=_0x3554eb,this[_0xe0484f(0xb3)]=_0x39a698[_0xe0484f(0xb3)]??'ak';}static async[_0x1b1ee6(0xd3)](_0x2b216d){const _0x269a61=_0x1b1ee6,_0x3c0930=new AccessKeyIssuer(_0x2b216d);return _0x3c0930[_0x269a61(0xaf)]=await hkdfSha256(_0x3c0930[_0x269a61(0xd2)],'access-key:'+_0x3c0930[_0x269a61(0xb3)]+_0x269a61(0xce)),_0x3c0930[_0x269a61(0xae)]=await hkdfSha256(_0x3c0930['master'],_0x269a61(0xde)+_0x3c0930[_0x269a61(0xb3)]+_0x269a61(0xdc)),_0x3c0930;}async[_0x1b1ee6(0xc5)](_0x395950){const _0x443664=_0x1b1ee6,_0x484e4f=await hmacSha256(this[_0x443664(0xae)],toBytes(_0x395950));return _0x484e4f['slice'](0x0,0x8);}async[_0x1b1ee6(0xc7)](_0x4190fd){const _0x3525e5=_0x1b1ee6,_0x139eb5={'aqPvR':function(_0x3c4856,_0x46ddf6){return _0x3c4856(_0x46ddf6);},'RFekU':function(_0x2e78c0,_0x2b1eba,_0xb4882b){return _0x2e78c0(_0x2b1eba,_0xb4882b);}};return this[_0x3525e5(0xdb)]({'depth':0x0,'keyId':_0x139eb5['aqPvR'](randomBytes,0x4),'uidRef':await this['uidRefOf'](_0x4190fd[_0x3525e5(0xd1)]),'scene':_0x139eb5['aqPvR'](sceneCode,_0x4190fd['scene']),'expiresAt':_0x139eb5[_0x3525e5(0xab)](resolveExpiry,_0x4190fd['ttl'],_0x4190fd[_0x3525e5(0xb5)]),'data':dataBytes(_0x4190fd['data'])});}async['derive'](_0x2d6aa5,_0x1ef39e={}){const _0x5a1b19=_0x1b1ee6,_0x4d4c47={'OLUyw':function(_0x3bb9ea,_0x2cd52a){return _0x3bb9ea(_0x2cd52a);},'wdyOB':'父\x20key\x20校验失败(伪造或已篡改)','IxgCv':function(_0x3e2896,_0x46b0b3){return _0x3e2896+_0x46b0b3;},'ZjkmA':function(_0x367a0a,_0xf3a24e){return _0x367a0a!==_0xf3a24e;},'PsxDx':function(_0x209691,_0xbb8b98){return _0x209691+_0xbb8b98;},'SZtPw':function(_0x584bf7,_0x259eec){return _0x584bf7(_0x259eec);}},_0x309a0f=_0x4d4c47['OLUyw'](parseAccessKey,_0x2d6aa5);if(!_0x309a0f)throw new AccessKeyError(_0x5a1b19(0xd5));if(!await this[_0x5a1b19(0xbf)](_0x309a0f))throw new AccessKeyError(_0x4d4c47['wdyOB']);if(_0x4d4c47[_0x5a1b19(0xa7)](_0x309a0f[_0x5a1b19(0xc9)],0x1)>MAX_DEPTH)throw new AccessKeyError('委派链深度超过上限\x20'+MAX_DEPTH);const _0x2af256=Math['min'](_0x309a0f[_0x5a1b19(0xb5)],_0x4d4c47['ZjkmA'](_0x1ef39e[_0x5a1b19(0xd7)],undefined)||_0x1ef39e[_0x5a1b19(0xb5)]!==undefined?resolveExpiry(_0x1ef39e['ttl'],_0x1ef39e[_0x5a1b19(0xb5)]):_0x309a0f['expiresAt']);return{...await this[_0x5a1b19(0xdb)]({'depth':_0x4d4c47[_0x5a1b19(0xd8)](_0x309a0f[_0x5a1b19(0xc9)],0x1),'keyId':_0x4d4c47['SZtPw'](randomBytes,0x4),'uidRef':_0x309a0f['uidRef'],'scene':_0x309a0f[_0x5a1b19(0xbb)],'expiresAt':_0x2af256,'data':_0x1ef39e[_0x5a1b19(0xc3)]!==undefined?_0x4d4c47['OLUyw'](dataBytes,_0x1ef39e[_0x5a1b19(0xc3)]):_0x309a0f[_0x5a1b19(0xc3)]}),'depth':_0x309a0f['depth']+0x1};}async[_0x1b1ee6(0xdb)](_0x10969d){const _0x4722a2=_0x1b1ee6,_0x1a8fa9={'SvzHY':function(_0x7e63d4,_0x2bde9b,_0x3c2a2d){return _0x7e63d4(_0x2bde9b,_0x3c2a2d);},'mBqiY':function(_0x560658,_0x34e915){return _0x560658(_0x34e915);}},_0x30bc48=new Uint8Array(HEADER_SIZE+0x1+_0x10969d[_0x4722a2(0xc3)][_0x4722a2(0xd9)]),_0x1e4a42=new DataView(_0x30bc48[_0x4722a2(0xd6)]);_0x30bc48[0x0]=_0x10969d['depth'],_0x30bc48[_0x4722a2(0xbe)](_0x10969d['keyId'],0x1),_0x30bc48['set'](_0x10969d[_0x4722a2(0xaa)],0x5),_0x30bc48[0xd]=_0x10969d[_0x4722a2(0xbb)],_0x1e4a42['setUint32'](0xe,_0x10969d[_0x4722a2(0xb5)],![]),_0x30bc48[HEADER_SIZE]=_0x10969d[_0x4722a2(0xc3)]['length'],_0x30bc48['set'](_0x10969d[_0x4722a2(0xc3)],HEADER_SIZE+0x1);const _0x5e063a=(await hmacSha256(this[_0x4722a2(0xaf)],_0x30bc48))['slice'](0x0,0x10),_0x483b62=_0x1a8fa9[_0x4722a2(0xba)](encodeToken,_0x30bc48,_0x5e063a);return{'key':_0x483b62,'keyId':_0x1a8fa9[_0x4722a2(0xb6)](toHex,_0x10969d[_0x4722a2(0xcc)]),'keyPrefix':_0x483b62['slice'](0x0,0xb),'expiresAt':_0x10969d[_0x4722a2(0xb5)]};}async[_0x1b1ee6(0xbf)](_0x443e04){const _0x5913aa=_0x1b1ee6,_0x44a3de={'iTNrs':function(_0x2e44a3,_0xa4485e,_0x22b4a1){return _0x2e44a3(_0xa4485e,_0x22b4a1);}},_0x1982c0=(await _0x44a3de['iTNrs'](hmacSha256,this[_0x5913aa(0xaf)],_0x443e04['payload']))[_0x5913aa(0xc6)](0x0,0x10);return _0x44a3de['iTNrs'](timingSafeEqual,_0x1982c0,_0x443e04['mac']);}}function dataBytes(_0x23d202){const _0x1e0e1=_0x1b1ee6,_0x2434e9={};_0x2434e9['kXdPn']=function(_0x2bfc28,_0x2a6090){return _0x2bfc28===_0x2a6090;};const _0x4eb3a7=_0x2434e9;if(_0x4eb3a7['kXdPn'](_0x23d202,undefined)||_0x4eb3a7[_0x1e0e1(0xda)](_0x23d202,null)||_0x23d202==='')return new Uint8Array(0x0);const _0x39cc75=textEncoder[_0x1e0e1(0xc0)](_0x23d202);if(_0x39cc75[_0x1e0e1(0xd9)]>MAX_DATA_BYTES)throw new AccessKeyError('内嵌数据超出上限\x20'+MAX_DATA_BYTES+_0x1e0e1(0xb7)+_0x39cc75['length']+')');return _0x39cc75;}function resolveExpiry(_0x2d9b9f,_0x5c21ae){const _0x3ee1d1=_0x1b1ee6,_0x3e013c={};_0x3e013c[_0x3ee1d1(0xb1)]=function(_0x3ddedf,_0x3e5a7f){return _0x3ddedf!==_0x3e5a7f;},_0x3e013c['uhxWK']=_0x3ee1d1(0xb0),_0x3e013c['xHPsn']=function(_0x22ed33,_0xc2c49a){return _0x22ed33<=_0xc2c49a;},_0x3e013c[_0x3ee1d1(0xc2)]=function(_0xe73f5d,_0x93a7cc){return _0xe73f5d!==_0x93a7cc;},_0x3e013c['LDrzd']=function(_0x553cbe,_0x498ddf){return _0x553cbe*_0x498ddf;};const _0x20d9d0=_0x3e013c;if(_0x20d9d0[_0x3ee1d1(0xb1)](_0x2d9b9f,undefined)&&_0x20d9d0['bdNBY'](_0x5c21ae,undefined))throw new AccessKeyError(_0x20d9d0[_0x3ee1d1(0xc1)]);if(_0x2d9b9f!==undefined){if(_0x20d9d0[_0x3ee1d1(0xcb)](_0x2d9b9f,0x0))throw new AccessKeyError(_0x3ee1d1(0xb4));return Math[_0x3ee1d1(0xb9)](Date[_0x3ee1d1(0xdf)]()/0x3e8)+_0x2d9b9f;}if(_0x20d9d0[_0x3ee1d1(0xc2)](_0x5c21ae,undefined)){if(_0x20d9d0['LDrzd'](_0x5c21ae,0x3e8)<=Date[_0x3ee1d1(0xdf)]())throw new AccessKeyError('expiresAt\x20必须晚于当前时间');return _0x5c21ae;}throw new AccessKeyError(_0x3ee1d1(0xcd));}export async function createIssuer(_0x19e83d){const _0x589806=_0x1b1ee6;return AccessKeyIssuer[_0x589806(0xd3)](_0x19e83d);}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * 枚举字典:scene 不写进 key 原文,只放序号(空 scene = 0xFF)。
3
+ * flags 保留单字节槽位(当前仅单资源标志)。
4
+ */
5
+ export declare const SCENES: readonly ["api", "mcp", "payment", "integration", "download", "merchant", "service", "ci"];
6
+ export type Scene = (typeof SCENES)[number];
7
+ /** 空 scene 的占位码(uint8 上限) */
8
+ export declare const SCENE_NONE = 255;
9
+ export declare function sceneCode(scene?: string): number;
10
+ export declare function sceneName(code: number): string;
11
+ /** 委派链最大深度 */
12
+ export declare const MAX_DEPTH = 4;
13
+ /** key 内嵌数据的字节上限(UTF-8) */
14
+ export declare const MAX_DATA_BYTES = 96;
15
+ //# sourceMappingURL=scopes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopes.d.ts","sourceRoot":"","sources":["../src/scopes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,MAAM,4FAST,CAAC;AAEX,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5C,6BAA6B;AAC7B,eAAO,MAAM,UAAU,MAAM,CAAC;AAE9B,wBAAgB,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,cAAc;AACd,eAAO,MAAM,SAAS,IAAI,CAAC;AAE3B,2BAA2B;AAC3B,eAAO,MAAM,cAAc,KAAK,CAAC"}
package/dist/scopes.js ADDED
@@ -0,0 +1 @@
1
+ const _0x1447df=_0x880f;(function(_0x4dc8d3,_0x47ade1){const _0xd48c90=_0x880f,_0x314812=_0x4dc8d3();while(!![]){try{const _0x1119f1=parseInt(_0xd48c90(0x1cd))/0x1*(parseInt(_0xd48c90(0x1d7))/0x2)+parseInt(_0xd48c90(0x1de))/0x3+parseInt(_0xd48c90(0x1dc))/0x4*(parseInt(_0xd48c90(0x1d2))/0x5)+-parseInt(_0xd48c90(0x1d0))/0x6*(parseInt(_0xd48c90(0x1df))/0x7)+-parseInt(_0xd48c90(0x1d5))/0x8+-parseInt(_0xd48c90(0x1cb))/0x9*(parseInt(_0xd48c90(0x1cc))/0xa)+-parseInt(_0xd48c90(0x1d8))/0xb*(-parseInt(_0xd48c90(0x1dd))/0xc);if(_0x1119f1===_0x47ade1)break;else _0x314812['push'](_0x314812['shift']());}catch(_0x5caa94){_0x314812['push'](_0x314812['shift']());}}}(_0x31d5,0x43b7f));function _0x880f(_0x4b1a50,_0x118896){_0x4b1a50=_0x4b1a50-0x1cb;const _0x31d5cb=_0x31d5();let _0x880f26=_0x31d5cb[_0x4b1a50];if(_0x880f['dxIlVO']===undefined){var _0x458542=function(_0x3e1354){const _0x4ed504='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3fe413='',_0x561c5c='';for(let _0x2e509b=0x0,_0xcf26c7,_0x2ee08e,_0x2e0ef9=0x0;_0x2ee08e=_0x3e1354['charAt'](_0x2e0ef9++);~_0x2ee08e&&(_0xcf26c7=_0x2e509b%0x4?_0xcf26c7*0x40+_0x2ee08e:_0x2ee08e,_0x2e509b++%0x4)?_0x3fe413+=String['fromCharCode'](0xff&_0xcf26c7>>(-0x2*_0x2e509b&0x6)):0x0){_0x2ee08e=_0x4ed504['indexOf'](_0x2ee08e);}for(let _0x29c56e=0x0,_0x265add=_0x3fe413['length'];_0x29c56e<_0x265add;_0x29c56e++){_0x561c5c+='%'+('00'+_0x3fe413['charCodeAt'](_0x29c56e)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x561c5c);};_0x880f['wjEnTz']=_0x458542,_0x880f['oCZCpi']={},_0x880f['dxIlVO']=!![];}const _0x7379ae=_0x31d5cb[0x0],_0x28dfa4=_0x4b1a50+_0x7379ae,_0x1cf4d2=_0x880f['oCZCpi'][_0x28dfa4];return!_0x1cf4d2?(_0x880f26=_0x880f['wjEnTz'](_0x880f26),_0x880f['oCZCpi'][_0x28dfa4]=_0x880f26):_0x880f26=_0x1cf4d2,_0x880f26;}export const SCENES=[_0x1447df(0x1d1),_0x1447df(0x1cf),'payment','integration',_0x1447df(0x1d9),_0x1447df(0x1ce),_0x1447df(0x1d3),'ci'];export const SCENE_NONE=0xff;export function sceneCode(_0x54e2b2){const _0x303f1c=_0x1447df,_0xbd71a8={};_0xbd71a8[_0x303f1c(0x1d6)]=function(_0x302131,_0x1b5145){return _0x302131+_0x1b5145;},_0xbd71a8[_0x303f1c(0x1d4)]=function(_0xcdbf79,_0x48c6cc){return _0xcdbf79%_0x48c6cc;};const _0x26620d=_0xbd71a8;if(!_0x54e2b2||!_0x54e2b2[_0x303f1c(0x1db)]())return SCENE_NONE;const _0x4b87ba=_0x54e2b2['trim'](),_0x5d95f4=SCENES['indexOf'](_0x4b87ba);if(_0x5d95f4>=0x0)return _0x5d95f4;const _0x59cda2=[..._0x4b87ba]['reduce']((_0x5acd1c,_0x42bfab)=>_0x5acd1c*0x1f+_0x42bfab['charCodeAt'](0x0)>>>0x0,0x7);return _0x26620d[_0x303f1c(0x1d6)](_0x26620d['lZhlC'](_0x59cda2,0xfe),0x1);}export function sceneName(_0x2ce4f0){const _0x4f9d5d=_0x1447df,_0x363ea0={};_0x363ea0[_0x4f9d5d(0x1da)]=function(_0x3a0195,_0x3597d0){return _0x3a0195===_0x3597d0;};const _0x48cbdd=_0x363ea0;return SCENES[_0x2ce4f0]??(_0x48cbdd['qwaRe'](_0x2ce4f0,SCENE_NONE)?'':'scene:'+_0x2ce4f0);}export const MAX_DEPTH=0x4;function _0x31d5(){const _0x626e28=['BwnW','mtyZnJjJq3HWDgq','yxbP','mtG3nZiXmeTlvw5Vqq','C2vYDMLJzq','BfPOBem','mtu1mJiWogjxDuDLAG','wLHQD2C','mM5SEuvRzG','nJzSsuz2C0e','zg93BMXVywq','CxDHuMu','DhjPBq','nhzbAK9yrG','ntaZmdrPBufsvum','mtu1mZq0nuXvDNv1zq','mtiYnwndwhnXvG','nte0ofbLD0Tkvq','mJqWrxbbv3nh','ndm5ndvzs2vbAfG','BwvYy2HHBNq'];_0x31d5=function(){return _0x626e28;};return _0x31d5();}export const MAX_DATA_BYTES=0x60;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * 验证器:零 I/O 纯算裁决,零存储。
3
+ * 判定顺序(fail-closed):格式 → MAC → 过期。
4
+ * key 的生命周期只由 TTL 决定;需要"全部作废"时轮换 master secret(配合 ver 代际)。
5
+ * verify 不 throw,认证失败是正常业务路径,reason 直接映射 401。
6
+ */
7
+ import type { AccessKeyIssuer } from './issuer.ts';
8
+ export interface VerifierOptions {
9
+ /** 对称模式:与 issuer 相同的 master secret */
10
+ masterSecret: string | Uint8Array;
11
+ /** 与 issuer 一致的 domain,默认 'ak' */
12
+ domain?: string;
13
+ /** 可注入时钟,测试用 */
14
+ clock?: () => number;
15
+ }
16
+ export interface AccessKeyAuth {
17
+ uidRef: string;
18
+ scene: string;
19
+ /** 内嵌携带数据(UTF-8 解码,空数据为空串) */
20
+ data: string;
21
+ keyId: string;
22
+ depth: number;
23
+ /** unix 秒 */
24
+ expiresAt: number;
25
+ }
26
+ export type VerifyFailureReason = 'malformed' | 'bad-mac' | 'expired';
27
+ export type VerifyResult = {
28
+ ok: true;
29
+ auth: AccessKeyAuth;
30
+ } | {
31
+ ok: false;
32
+ reason: VerifyFailureReason;
33
+ };
34
+ export declare class AccessKeyVerifier {
35
+ private readonly macKey;
36
+ private readonly clock;
37
+ private constructor();
38
+ static create(options: VerifierOptions): Promise<AccessKeyVerifier>;
39
+ /** 纯算裁决,不 throw。返回的 reason 可直接映射 401 */
40
+ verify(rawKey: string, ctx?: {
41
+ now?: number;
42
+ }): Promise<VerifyResult>;
43
+ }
44
+ export declare function createVerifier(options: VerifierOptions): Promise<AccessKeyVerifier>;
45
+ export type { AccessKeyIssuer };
46
+ //# sourceMappingURL=verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../src/verifier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,YAAY,EAAE,MAAM,GAAG,UAAU,CAAC;IAClC,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,mBAAmB,GAC3B,WAAW,GACX,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,aAAa,CAAA;CAAE,GACjC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAE/C,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IAErC,OAAO;WAQM,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAUzE,wCAAwC;IAClC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,YAAY,CAAC;CAqBhF;AAQD,wBAAsB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAEzF;AAED,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ const _0x58d752=_0x1973;(function(_0x5aa20d,_0xa5850f){const _0x169015=_0x1973,_0x3cecdc=_0x5aa20d();while(!![]){try{const _0x44a071=-parseInt(_0x169015(0xa9))/0x1*(parseInt(_0x169015(0xbb))/0x2)+-parseInt(_0x169015(0xa0))/0x3+-parseInt(_0x169015(0xa6))/0x4+-parseInt(_0x169015(0xad))/0x5+parseInt(_0x169015(0x9f))/0x6+-parseInt(_0x169015(0xb9))/0x7+parseInt(_0x169015(0xb3))/0x8;if(_0x44a071===_0xa5850f)break;else _0x3cecdc['push'](_0x3cecdc['shift']());}catch(_0x3c8bbd){_0x3cecdc['push'](_0x3cecdc['shift']());}}}(_0x3f22,0xf390f));import{hmacSha256,hkdfSha256,toBytes,timingSafeEqual}from'./crypto.js';function _0x1973(_0x2df869,_0x208505){_0x2df869=_0x2df869-0x9f;const _0x3f2287=_0x3f22();let _0x1973d5=_0x3f2287[_0x2df869];if(_0x1973['oySfua']===undefined){var _0xf1ac12=function(_0x1347b1){const _0x110c53='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x460330='',_0xdaa29f='';for(let _0x4cee42=0x0,_0x29a7f3,_0x34c32c,_0x1a4f31=0x0;_0x34c32c=_0x1347b1['charAt'](_0x1a4f31++);~_0x34c32c&&(_0x29a7f3=_0x4cee42%0x4?_0x29a7f3*0x40+_0x34c32c:_0x34c32c,_0x4cee42++%0x4)?_0x460330+=String['fromCharCode'](0xff&_0x29a7f3>>(-0x2*_0x4cee42&0x6)):0x0){_0x34c32c=_0x110c53['indexOf'](_0x34c32c);}for(let _0x24219f=0x0,_0x39e04d=_0x460330['length'];_0x24219f<_0x39e04d;_0x24219f++){_0xdaa29f+='%'+('00'+_0x460330['charCodeAt'](_0x24219f)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0xdaa29f);};_0x1973['gzIuiJ']=_0xf1ac12,_0x1973['fDqrOW']={},_0x1973['oySfua']=!![];}const _0xa29886=_0x3f2287[0x0],_0x1d3bc1=_0x2df869+_0xa29886,_0x56329d=_0x1973['fDqrOW'][_0x1d3bc1];return!_0x56329d?(_0x1973d5=_0x1973['gzIuiJ'](_0x1973d5),_0x1973['fDqrOW'][_0x1d3bc1]=_0x1973d5):_0x1973d5=_0x56329d,_0x1973d5;}function _0x3f22(){const _0x2b0f00=['zgvWDgG','s25hAwC','mJi5nte0neneuMjbsG','yMfKlw1HyW','BwfJ','ota1mJm4ChLNtLvm','zMXVB3i','q3D4y2y','y1b1t2q','mJKWmZa4meDOBgvpzq','zxHWAxjLC0f0','C2XPy2u','BM93','C2nLBMu','Dg9tDhjPBMC','mZm5nte5mZzrs2zOEeq','zg9TywLU','BgvUz3rO','zgvJB2rL','BwfJs2v5','y3jLyxrL','nZuZmJq2mKLYB1HOCq','y2XVy2S','mKfKvLfoDG','mtaZndq0ntbMqu9TEfe','ntuWnde0mNPACgjyzG','A2v5swrizxG','BwfZDgvYu2vJCMv0','CgfKu3rHCNq'];_0x3f22=function(){return _0x2b0f00;};return _0x3f22();}import{parseAccessKey}from'./wire.js';import{sceneName}from'./scopes.js';export class AccessKeyVerifier{['macKey'];[_0x58d752(0xba)];constructor(_0xdf7c62,_0x1589c0){const _0x39f61d=_0x58d752;this[_0x39f61d(0xb7)]=_0x1589c0,this[_0x39f61d(0xba)]=_0xdf7c62[_0x39f61d(0xba)]??(()=>Math[_0x39f61d(0xaa)](Date['now']()/0x3e8));}static async[_0x58d752(0xb8)](_0x324d8c){const _0x475471=_0x58d752,_0xc01f01={'Cwxcf':function(_0x4c315d,_0x57c68b){return _0x4c315d(_0x57c68b);},'KRAkp':'masterSecret\x20至少\x2032\x20字节','KnGig':function(_0x381286,_0x567c28,_0x53e63c){return _0x381286(_0x567c28,_0x53e63c);}},_0x343e21=_0xc01f01[_0x475471(0xab)](toBytes,_0x324d8c[_0x475471(0xa2)]);if(_0x343e21[_0x475471(0xb5)]<0x20)throw new Error(_0xc01f01['KRAkp']);const _0x22d2e1=_0x324d8c[_0x475471(0xb4)]??'ak',_0x5df8cb=await _0xc01f01[_0x475471(0xa5)](hkdfSha256,_0x343e21,'access-key:'+_0x22d2e1+':v1');return new AccessKeyVerifier(_0x324d8c,_0x5df8cb);}async['verify'](_0xcc6367,_0x16639c={}){const _0x14905c=_0x58d752,_0x4370bd={'OIVwO':_0x14905c(0xa7),'cPuOd':function(_0x412bf5,_0x29cc2c){return _0x412bf5(_0x29cc2c);}},_0x2826b2=parseAccessKey(_0xcc6367),_0x476af8={};_0x476af8['ok']=![],_0x476af8['reason']='malformed';if(!_0x2826b2)return _0x476af8;const _0x36313f=(await hmacSha256(this[_0x14905c(0xb7)],_0x2826b2['payload']))[_0x14905c(0xaf)](0x0,0x10),_0x700732={};_0x700732['ok']=![],_0x700732['reason']=_0x4370bd['OIVwO'];if(!timingSafeEqual(_0x36313f,_0x2826b2[_0x14905c(0xa8)]))return _0x700732;const _0x1a65cf=_0x16639c[_0x14905c(0xb0)]??this[_0x14905c(0xba)](),_0x4cb047={};_0x4cb047['ok']=![],_0x4cb047['reason']='expired';if(_0x2826b2[_0x14905c(0xae)]<=_0x1a65cf)return _0x4cb047;const _0x30e5f4={'uidRef':_0x4370bd['cPuOd'](toHexView,_0x2826b2['uidRef']),'scene':_0x4370bd[_0x14905c(0xac)](sceneName,_0x2826b2[_0x14905c(0xb1)]),'data':new TextDecoder()[_0x14905c(0xb6)](_0x2826b2['data']),'keyId':_0x2826b2[_0x14905c(0xa1)],'depth':_0x2826b2[_0x14905c(0xa4)],'expiresAt':_0x2826b2[_0x14905c(0xae)]},_0x7a0459={};return _0x7a0459['ok']=!![],_0x7a0459['auth']=_0x30e5f4,_0x7a0459;}}function toHexView(_0x192c5b){const _0x3a8f06=_0x58d752;let _0x3f5e7f='';for(const _0x567ea9 of _0x192c5b)_0x3f5e7f+=_0x567ea9[_0x3a8f06(0xb2)](0x10)[_0x3a8f06(0xa3)](0x2,'0');return _0x3f5e7f;}export async function createVerifier(_0x1e6994){return AccessKeyVerifier['create'](_0x1e6994);}
package/dist/wire.d.ts ADDED
@@ -0,0 +1,40 @@
1
+ /**
2
+ * 线上格式(wire format):a1_ + base64url(变长二进制)
3
+ *
4
+ * ┌─────┬────────┬────────┬─────┬────────┬─────────┬──────────┐
5
+ * │depth│ key_id │ uid_ref│scene│ expiry │ data │ MAC(16B) │
6
+ * │ 1B │ 4B │ 8B │ 1B │ 4B │1B+0..96 │ 截断128位 │
7
+ * └─────┴────────┴────────┴─────┴────────┴─────────┴──────────┘
8
+ *
9
+ * payload = 18B 固定头 + 1B dataLen + data(0..96B)
10
+ * 空 data:35B → 50 字符;满 96B:131B → 178 字符
11
+ *
12
+ * 布局是公开的:凭证的安全承诺是完整性(不可伪造/篡改),不是机密性。
13
+ */
14
+ export declare const KEY_PREFIX = "a1_";
15
+ export declare const HEADER_SIZE = 18;
16
+ export declare const MAC_SIZE = 16;
17
+ export declare const MIN_TOKEN_SIZE: number;
18
+ export interface ParsedAccessKey {
19
+ /** 委派深度,0 = 直接签发 */
20
+ depth: number;
21
+ /** 4 字节,十六进制字符串(日志定位 / 吊销索引) */
22
+ keyIdHex: string;
23
+ keyId: Uint8Array;
24
+ /** uid 的 8 字节截断哈希(不含 uid 原文) */
25
+ uidRef: Uint8Array;
26
+ /** scene 序号(255 = 空) */
27
+ scene: number;
28
+ /** unix 秒 */
29
+ expiresAt: number;
30
+ /** 内嵌数据(0..96B) */
31
+ data: Uint8Array;
32
+ /** 18+1+dataLen 字节原始 payload(重算 MAC 用) */
33
+ payload: Uint8Array;
34
+ /** 16 字节 MAC */
35
+ mac: Uint8Array;
36
+ }
37
+ export declare function encodeToken(payload: Uint8Array, mac: Uint8Array): string;
38
+ /** 只解码不判断 —— 返回 null 表示格式坏,不区分原因 */
39
+ export declare function parseAccessKey(raw: string): ParsedAccessKey | null;
40
+ //# sourceMappingURL=wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../src/wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,eAAO,MAAM,UAAU,QAAQ,CAAC;AAChC,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,eAAO,MAAM,QAAQ,KAAK,CAAC;AAC3B,eAAO,MAAM,cAAc,QAA6B,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,gCAAgC;IAChC,MAAM,EAAE,UAAU,CAAC;IACnB,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,IAAI,EAAE,UAAU,CAAC;IACjB,0CAA0C;IAC1C,OAAO,EAAE,UAAU,CAAC;IACpB,gBAAgB;IAChB,GAAG,EAAE,UAAU,CAAC;CACjB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,MAAM,CAKxE;AAED,oCAAoC;AACpC,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAgClE"}
package/dist/wire.js ADDED
@@ -0,0 +1 @@
1
+ (function(_0x4dcb60,_0x38b149){const _0xf348ab=_0x5009,_0x27f429=_0x4dcb60();while(!![]){try{const _0x435987=-parseInt(_0xf348ab(0x130))/0x1+parseInt(_0xf348ab(0x131))/0x2+parseInt(_0xf348ab(0x12e))/0x3+parseInt(_0xf348ab(0x128))/0x4*(parseInt(_0xf348ab(0x137))/0x5)+-parseInt(_0xf348ab(0x125))/0x6*(-parseInt(_0xf348ab(0x12b))/0x7)+-parseInt(_0xf348ab(0x12a))/0x8+-parseInt(_0xf348ab(0x133))/0x9*(parseInt(_0xf348ab(0x12c))/0xa);if(_0x435987===_0x38b149)break;else _0x27f429['push'](_0x27f429['shift']());}catch(_0x432035){_0x27f429['push'](_0x27f429['shift']());}}}(_0x3ee6,0x948ff));import{b64uDecode,b64uEncode}from'./crypto.js';import{MAX_DATA_BYTES}from'./scopes.js';export const KEY_PREFIX='a1_';export const HEADER_SIZE=0x12;export const MAC_SIZE=0x10;function _0x5009(_0x2736c1,_0x493f43){_0x2736c1=_0x2736c1-0x124;const _0x3ee6f0=_0x3ee6();let _0x500971=_0x3ee6f0[_0x2736c1];if(_0x5009['epuIWi']===undefined){var _0x547fcc=function(_0x5c4f10){const _0x1db842='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x40f9fb='',_0x12d8f8='';for(let _0x5aad6d=0x0,_0x15624e,_0x5778c6,_0x2cf4ce=0x0;_0x5778c6=_0x5c4f10['charAt'](_0x2cf4ce++);~_0x5778c6&&(_0x15624e=_0x5aad6d%0x4?_0x15624e*0x40+_0x5778c6:_0x5778c6,_0x5aad6d++%0x4)?_0x40f9fb+=String['fromCharCode'](0xff&_0x15624e>>(-0x2*_0x5aad6d&0x6)):0x0){_0x5778c6=_0x1db842['indexOf'](_0x5778c6);}for(let _0x1bec9e=0x0,_0x300964=_0x40f9fb['length'];_0x1bec9e<_0x300964;_0x1bec9e++){_0x12d8f8+='%'+('00'+_0x40f9fb['charCodeAt'](_0x1bec9e)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x12d8f8);};_0x5009['dIfkgC']=_0x547fcc,_0x5009['KVjEaE']={},_0x5009['epuIWi']=!![];}const _0x4cac7f=_0x3ee6f0[0x0],_0x18a59d=_0x2736c1+_0x4cac7f,_0x2837ea=_0x5009['KVjEaE'][_0x18a59d];return!_0x2837ea?(_0x500971=_0x5009['dIfkgC'](_0x500971),_0x5009['KVjEaE'][_0x18a59d]=_0x500971):_0x500971=_0x2837ea,_0x500971;}export const MIN_TOKEN_SIZE=HEADER_SIZE+0x1+MAC_SIZE;export function encodeToken(_0x2d1fa2,_0x49be41){const _0x4f93c7=_0x5009,_0x1a0647={};_0x1a0647[_0x4f93c7(0x126)]=function(_0x4fba8b,_0x11dd56){return _0x4fba8b+_0x11dd56;};const _0x5a71e7=_0x1a0647,_0x264291=new Uint8Array(_0x5a71e7['njiLk'](_0x2d1fa2['length'],MAC_SIZE));return _0x264291[_0x4f93c7(0x138)](_0x2d1fa2,0x0),_0x264291[_0x4f93c7(0x138)](_0x49be41,_0x2d1fa2[_0x4f93c7(0x135)]),KEY_PREFIX+b64uEncode(_0x264291);}export function parseAccessKey(_0x796a8c){const _0x57e696=_0x5009,_0x5e9da6={'poIgh':function(_0x38b8b5,_0x784f2a){return _0x38b8b5+_0x784f2a;},'AWKBM':function(_0x4a14ee,_0x1f2014){return _0x4a14ee<_0x1f2014;},'zSheO':function(_0x4f5acf,_0x5323a2){return _0x4f5acf-_0x5323a2;},'affxh':function(_0x243ba9,_0x2cbbb0){return _0x243ba9(_0x2cbbb0);}};if(typeof _0x796a8c!=='string'||!_0x796a8c['startsWith'](KEY_PREFIX))return null;const _0x58b8fb=_0x796a8c['slice'](KEY_PREFIX[_0x57e696(0x135)]);let _0x37acd9;try{_0x37acd9=b64uDecode(_0x58b8fb);}catch{return null;}const _0x41a01d=_0x5e9da6[_0x57e696(0x134)](_0x5e9da6[_0x57e696(0x134)](HEADER_SIZE,0x1),MAX_DATA_BYTES)+MAC_SIZE;if(_0x5e9da6['AWKBM'](_0x37acd9[_0x57e696(0x135)],MIN_TOKEN_SIZE)||_0x37acd9[_0x57e696(0x135)]>_0x41a01d)return null;const _0x38a0fd=_0x37acd9['slice'](0x0,_0x37acd9[_0x57e696(0x135)]-MAC_SIZE),_0x109b73=_0x37acd9[_0x57e696(0x129)](_0x37acd9['length']-MAC_SIZE),_0x43f404=new DataView(_0x38a0fd[_0x57e696(0x132)],_0x38a0fd[_0x57e696(0x12d)],_0x38a0fd[_0x57e696(0x136)]),_0x4704fc=_0x38a0fd[HEADER_SIZE];if(_0x4704fc!==_0x5e9da6['zSheO'](_0x38a0fd['length']-HEADER_SIZE,0x1))return null;if(_0x4704fc>MAX_DATA_BYTES)return null;return{'depth':_0x38a0fd[0x0],'keyId':_0x38a0fd[_0x57e696(0x129)](0x1,0x5),'keyIdHex':_0x5e9da6[_0x57e696(0x12f)](toHexSafe,_0x38a0fd[_0x57e696(0x129)](0x1,0x5)),'uidRef':_0x38a0fd[_0x57e696(0x129)](0x5,0xd),'scene':_0x38a0fd[0xd],'expiresAt':_0x43f404['getUint32'](0xe,![]),'data':_0x38a0fd[_0x57e696(0x129)](HEADER_SIZE+0x1),'payload':_0x38a0fd,'mac':_0x109b73};}function _0x3ee6(){const _0xffbd4c=['Dg9tDhjPBMC','mti2nM5hB3nbDq','BMPPtgS','CgfKu3rHCNq','mtGXoti1nNL1sMDXAG','C2XPy2u','mZeWnJC1mLL0Dfj2sa','mtC0mZDctKP0sue','mtaWDvLuDufx','yNL0zu9MzNnLDa','mJiWmtKXoxnWtNzADq','ywzMEgG','nZy0ndy2uLHMAw1O','mJi3mJGWnKPlC2zota','yNvMzMvY','otGWntiZANjbswri','Cg9jz2G','BgvUz3rO','yNL0zuXLBMD0Aa','nxvgvMPmDq','C2v0'];_0x3ee6=function(){return _0xffbd4c;};return _0x3ee6();}function toHexSafe(_0x36239e){const _0x18a054=_0x5009;let _0x8e7bdc='';for(const _0x541a91 of _0x36239e)_0x8e7bdc+=_0x541a91[_0x18a054(0x124)](0x10)[_0x18a054(0x127)](0x2,'0');return _0x8e7bdc;}
package/package.json CHANGED
@@ -1,6 +1,46 @@
1
1
  {
2
2
  "name": "@blod-nm/ak",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Stateless compute-verified access keys: variable-length binary layout, HMAC-SHA256 truncated MAC, zero I/O verification, zero storage. Edge-runtime compatible (Web Crypto only).",
6
+ "license": "MIT",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "sideEffects": false,
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.build.json && bun scripts/build.mjs",
21
+ "test": "bun test test/",
22
+ "check-types": "tsc --noEmit",
23
+ "prepack": "bun run build"
24
+ },
25
+ "engines": {
26
+ "node": ">=20"
27
+ },
28
+ "keywords": [
29
+ "access-key",
30
+ "api-key",
31
+ "stateless",
32
+ "authentication",
33
+ "hmac",
34
+ "zero-trust",
35
+ "edge"
36
+ ],
37
+ "devDependencies": {
38
+ "@types/bun": "^1.4.4",
39
+ "@types/node": "^26.6.6",
40
+ "javascript-obfuscator": "^4.2.2"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public",
44
+ "registry": "https://registry.npmjs.org"
45
+ }
46
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.