@vibes.diy/identity 2.6.2 → 2.6.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/device-id/certor.d.ts +14 -0
- package/device-id/certor.js +54 -0
- package/device-id/certor.js.map +1 -0
- package/device-id/csr.d.ts +10 -0
- package/device-id/csr.js +52 -0
- package/device-id/csr.js.map +1 -0
- package/device-id/key.d.ts +13 -0
- package/device-id/key.js +46 -0
- package/device-id/key.js.map +1 -0
- package/device-id/sign.d.ts +8 -0
- package/device-id/sign.js +31 -0
- package/device-id/sign.js.map +1 -0
- package/node.d.ts +4 -1
- package/node.js +6 -2
- package/node.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BaseXXEndeCoder, CertificatePayload } from "@fireproof/core-types-base";
|
|
2
|
+
import type { CertorIf } from "@fireproof/core-types-device-id";
|
|
3
|
+
export declare class Certor implements CertorIf {
|
|
4
|
+
#private;
|
|
5
|
+
readonly base64: BaseXXEndeCoder;
|
|
6
|
+
static fromString(base64: BaseXXEndeCoder, cert: string): Certor;
|
|
7
|
+
static fromUnverifiedJWT(base64: BaseXXEndeCoder, jwtString: string): Certor;
|
|
8
|
+
constructor(base64: BaseXXEndeCoder, cert: CertificatePayload);
|
|
9
|
+
asCert(): CertificatePayload;
|
|
10
|
+
parseCertificateSubject(s: string): Record<string, string>;
|
|
11
|
+
asSHA1(): Promise<string>;
|
|
12
|
+
asSHA256(): Promise<string>;
|
|
13
|
+
asBase64(): string;
|
|
14
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { toSortedObject } from "@adviser/cement";
|
|
2
|
+
import { CertificatePayloadSchema } from "@fireproof/core-types-base";
|
|
3
|
+
import { decodeJwt } from "jose";
|
|
4
|
+
import { base58btc } from "multiformats/bases/base58";
|
|
5
|
+
import { sha1 } from "multiformats/hashes/sha1";
|
|
6
|
+
import { sha256 } from "multiformats/hashes/sha2";
|
|
7
|
+
import { deepFreeze } from "@fireproof/core-runtime";
|
|
8
|
+
export class Certor {
|
|
9
|
+
#cert;
|
|
10
|
+
base64;
|
|
11
|
+
#strCert;
|
|
12
|
+
#uint8Cert;
|
|
13
|
+
static fromString(base64, cert) {
|
|
14
|
+
const certObj = CertificatePayloadSchema.parse(JSON.parse(base64.decode(cert)));
|
|
15
|
+
return new Certor(base64, certObj);
|
|
16
|
+
}
|
|
17
|
+
static fromUnverifiedJWT(base64, jwtString) {
|
|
18
|
+
const payload = decodeJwt(jwtString);
|
|
19
|
+
const certObj = CertificatePayloadSchema.parse(payload);
|
|
20
|
+
return new Certor(base64, certObj);
|
|
21
|
+
}
|
|
22
|
+
constructor(base64, cert) {
|
|
23
|
+
this.#cert = deepFreeze(toSortedObject(cert));
|
|
24
|
+
this.base64 = base64;
|
|
25
|
+
}
|
|
26
|
+
asCert() {
|
|
27
|
+
return this.#cert;
|
|
28
|
+
}
|
|
29
|
+
parseCertificateSubject(s) {
|
|
30
|
+
const parts = {};
|
|
31
|
+
s.split(",").forEach((part) => {
|
|
32
|
+
const [key, value] = part.trim().split("=");
|
|
33
|
+
if (key && value) {
|
|
34
|
+
parts[key] = value;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return parts;
|
|
38
|
+
}
|
|
39
|
+
async asSHA1() {
|
|
40
|
+
this.#uint8Cert ||= this.base64.decodeUint8(this.asBase64());
|
|
41
|
+
const val = await sha1.digest(this.#uint8Cert);
|
|
42
|
+
return base58btc.encode(val.bytes);
|
|
43
|
+
}
|
|
44
|
+
async asSHA256() {
|
|
45
|
+
this.#uint8Cert ||= this.base64.decodeUint8(this.asBase64());
|
|
46
|
+
const val = await sha256.digest(this.#uint8Cert);
|
|
47
|
+
return base58btc.encode(val.bytes);
|
|
48
|
+
}
|
|
49
|
+
asBase64() {
|
|
50
|
+
this.#strCert ||= this.base64.encode(JSON.stringify(toSortedObject(this.#cert)));
|
|
51
|
+
return this.#strCert;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=certor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"certor.js","sourceRoot":"","sources":["../../jsr/device-id/certor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Subject, Extensions, FPDeviceIDCSRPayload, SuperThis } from "@fireproof/core-types-base";
|
|
2
|
+
import { Result } from "@adviser/cement";
|
|
3
|
+
import { DeviceIdKey } from "./key.js";
|
|
4
|
+
export declare class DeviceIdCSR {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(sthis: SuperThis, key: DeviceIdKey);
|
|
7
|
+
createCSRPayload(subject: Subject, extensions?: Partial<Extensions>): Promise<FPDeviceIDCSRPayload>;
|
|
8
|
+
signCSR(payload: FPDeviceIDCSRPayload): Promise<Result<string>>;
|
|
9
|
+
createCSR(subject: Subject, extensions?: Partial<Extensions>): Promise<Result<string, Error>>;
|
|
10
|
+
}
|
package/device-id/csr.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { calculateJwkThumbprint, SignJWT } from "jose";
|
|
2
|
+
import { FPDeviceIDCSRPayloadSchema } from "@fireproof/core-types-base";
|
|
3
|
+
import { exception2Result } from "@adviser/cement";
|
|
4
|
+
export class DeviceIdCSR {
|
|
5
|
+
#key;
|
|
6
|
+
#sthis;
|
|
7
|
+
constructor(sthis, key) {
|
|
8
|
+
this.#key = key;
|
|
9
|
+
this.#sthis = sthis;
|
|
10
|
+
}
|
|
11
|
+
async createCSRPayload(subject, extensions = {}) {
|
|
12
|
+
const now = Math.floor(Date.now() / 1000);
|
|
13
|
+
return FPDeviceIDCSRPayloadSchema.parse({
|
|
14
|
+
sub: subject.commonName,
|
|
15
|
+
iss: "csr-client",
|
|
16
|
+
aud: "certificate-authority",
|
|
17
|
+
iat: now,
|
|
18
|
+
exp: now + 3600,
|
|
19
|
+
jti: this.#sthis.nextId(16).str,
|
|
20
|
+
csr: {
|
|
21
|
+
subject: subject,
|
|
22
|
+
publicKey: await this.#key.publicKey(),
|
|
23
|
+
extensions: {
|
|
24
|
+
subjectAltName: extensions.subjectAltName || [],
|
|
25
|
+
keyUsage: extensions.keyUsage || ["digitalSignature", "keyEncipherment"],
|
|
26
|
+
extendedKeyUsage: extensions.extendedKeyUsage || ["serverAuth"],
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
async signCSR(payload) {
|
|
32
|
+
return exception2Result(async () => {
|
|
33
|
+
const publicJWK = await this.#key.publicKey();
|
|
34
|
+
const jws = await new SignJWT(payload)
|
|
35
|
+
.setProtectedHeader({
|
|
36
|
+
alg: "ES256",
|
|
37
|
+
typ: "CSR+JWT",
|
|
38
|
+
jwk: publicJWK,
|
|
39
|
+
kid: await calculateJwkThumbprint(publicJWK, "sha256"),
|
|
40
|
+
})
|
|
41
|
+
.setIssuedAt()
|
|
42
|
+
.setExpirationTime("1h")
|
|
43
|
+
.sign(await this.#key.exportPrivateJWK());
|
|
44
|
+
return jws;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async createCSR(subject, extensions = {}) {
|
|
48
|
+
const payload = await this.createCSRPayload(subject, extensions);
|
|
49
|
+
return this.signCSR(payload);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=csr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csr.js","sourceRoot":"","sources":["../../jsr/device-id/csr.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAqC,MAAM,MAAM,CAAC;AAC1F,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAExE,OAAO,EAAE,gBAAgB,EAAU,MAAM,iBAAiB,CAAC;AAG3D,MAAM,OAAO,WAAW;IACb,IAAI,CAAc;IAClB,MAAM,CAAY;IAE3B,YAAY,KAAgB,EAAE,GAAgB;QAC5C,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAgB,EAAE,UAAU,GAAwB,EAAE;QAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,OAAO,0BAA0B,CAAC,KAAK,CAAC;YACtC,GAAG,EAAE,OAAO,CAAC,UAAU;YACvB,GAAG,EAAE,YAAY;YACjB,GAAG,EAAE,uBAAuB;YAC5B,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,GAAG,GAAG,IAAI;YACf,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG;YAC/B,GAAG,EAAE;gBACH,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;gBACtC,UAAU,EAAE;oBACV,cAAc,EAAE,UAAU,CAAC,cAAc,IAAI,EAAE;oBAC/C,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;oBACxE,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,IAAI,CAAC,YAAY,CAAC;iBAChE;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA6B;QACzC,OAAO,gBAAgB,CAAC,KAAK,IAAI,EAAE;YACjC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,OAAyB,CAAC;iBACrD,kBAAkB,CAAC;gBAClB,GAAG,EAAE,OAAO;gBACZ,GAAG,EAAE,SAAS;gBACd,GAAG,EAAE,SAAS;gBACd,GAAG,EAAE,MAAM,sBAAsB,CAAC,SAAS,EAAE,QAAQ,CAAC;aACvD,CAAC;iBACD,WAAW,EAAE;iBACb,iBAAiB,CAAC,IAAI,CAAC;iBACvB,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;YAC5C,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAgB,EAAE,UAAU,GAAwB,EAAE;QACpE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Result } from "@adviser/cement";
|
|
2
|
+
import type { JWKPrivate, JWKPublic } from "@fireproof/core-types-base";
|
|
3
|
+
import type { DeviceIdKeyIf } from "@fireproof/core-types-device-id";
|
|
4
|
+
import { type GenerateKeyPairOptions } from "jose";
|
|
5
|
+
export declare class DeviceIdKey implements DeviceIdKeyIf {
|
|
6
|
+
#private;
|
|
7
|
+
static create(opts?: GenerateKeyPairOptions): Promise<DeviceIdKey>;
|
|
8
|
+
static createFromJWK(jwk: JWKPrivate, opts?: GenerateKeyPairOptions): Promise<Result<DeviceIdKey>>;
|
|
9
|
+
private constructor();
|
|
10
|
+
fingerPrint(): Promise<string>;
|
|
11
|
+
exportPrivateJWK(): Promise<JWKPrivate>;
|
|
12
|
+
publicKey(): Promise<JWKPublic>;
|
|
13
|
+
}
|
package/device-id/key.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Result } from "@adviser/cement";
|
|
2
|
+
import { JWKPrivateSchema, JWKPublicSchema } from "@fireproof/core-types-base";
|
|
3
|
+
import { generateKeyPair, exportJWK, calculateJwkThumbprint } from "jose";
|
|
4
|
+
import { sts } from "@fireproof/core-runtime";
|
|
5
|
+
export class DeviceIdKey {
|
|
6
|
+
#privateKey;
|
|
7
|
+
static async create(opts = { extractable: true }) {
|
|
8
|
+
const pair = await generateKeyPair("ES256", opts);
|
|
9
|
+
return new DeviceIdKey(pair.privateKey);
|
|
10
|
+
}
|
|
11
|
+
static async createFromJWK(jwk, opts = { extractable: true }) {
|
|
12
|
+
const parsed = JWKPrivateSchema.safeParse(jwk);
|
|
13
|
+
if (!parsed.success) {
|
|
14
|
+
return Result.Err(`Invalid JWK: ${parsed.error.message}`);
|
|
15
|
+
}
|
|
16
|
+
const j = parsed.data;
|
|
17
|
+
const rKey = await sts.importJWK(j, undefined, opts);
|
|
18
|
+
if (rKey.isErr()) {
|
|
19
|
+
return Result.Err(rKey);
|
|
20
|
+
}
|
|
21
|
+
return Result.Ok(new DeviceIdKey(rKey.Ok().key));
|
|
22
|
+
}
|
|
23
|
+
constructor(pair) {
|
|
24
|
+
this.#privateKey = pair;
|
|
25
|
+
}
|
|
26
|
+
async fingerPrint() {
|
|
27
|
+
return calculateJwkThumbprint(await this.exportPrivateJWK(), "sha256");
|
|
28
|
+
}
|
|
29
|
+
async exportPrivateJWK() {
|
|
30
|
+
const jwk = await exportJWK(this.#privateKey);
|
|
31
|
+
const { success, data } = JWKPrivateSchema.safeParse(jwk);
|
|
32
|
+
if (!success || !data) {
|
|
33
|
+
throw new Error("Invalid JWK");
|
|
34
|
+
}
|
|
35
|
+
return data;
|
|
36
|
+
}
|
|
37
|
+
async publicKey() {
|
|
38
|
+
const privateJWK = await exportJWK(this.#privateKey);
|
|
39
|
+
const { success, data, error } = JWKPublicSchema.safeParse(privateJWK);
|
|
40
|
+
if (!success || !data) {
|
|
41
|
+
throw new Error(`Invalid public JWK: ${error.message}`);
|
|
42
|
+
}
|
|
43
|
+
return data;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.js","sourceRoot":"","sources":["../../jsr/device-id/key.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG/E,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,sBAAsB,EAA+B,MAAM,MAAM,CAAC;AACvG,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAE9C,MAAM,OAAO,WAAW;IACb,WAAW,CAAY;IAEhC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAA2B,EAAE,WAAW,EAAE,IAAI,EAAE;QACtE,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClD,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,UAAuB,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAe,EAAE,IAAI,GAA2B,EAAE,WAAW,EAAE,IAAI,EAAE;QAC9F,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;QACtB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,MAAM,CAAC,EAAE,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,GAAgB,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,YAAoB,IAAe;QACjC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,sBAAsB,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,EAAE,QAAQ,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACvE,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { BaseXXEndeCoder, CertificatePayload, JWTPayload } from "@fireproof/core-types-base";
|
|
2
|
+
import { DeviceIdKey } from "./key.js";
|
|
3
|
+
export declare class DeviceIdSignMsg {
|
|
4
|
+
#private;
|
|
5
|
+
readonly base64: BaseXXEndeCoder;
|
|
6
|
+
constructor(base64: BaseXXEndeCoder, key: DeviceIdKey, cert: CertificatePayload);
|
|
7
|
+
sign<T extends JWTPayload>(payload: T, algorithm?: string): Promise<string>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { calculateJwkThumbprint, SignJWT } from "jose";
|
|
2
|
+
import { Certor } from "./certor.js";
|
|
3
|
+
export class DeviceIdSignMsg {
|
|
4
|
+
#key;
|
|
5
|
+
#cert;
|
|
6
|
+
base64;
|
|
7
|
+
constructor(base64, key, cert) {
|
|
8
|
+
this.#key = key;
|
|
9
|
+
this.#cert = cert;
|
|
10
|
+
this.base64 = base64;
|
|
11
|
+
}
|
|
12
|
+
async sign(payload, algorithm = "ES256") {
|
|
13
|
+
const certor = new Certor(this.base64, this.#cert);
|
|
14
|
+
const x5c = [certor.asBase64()];
|
|
15
|
+
const x5t = await certor.asSHA1();
|
|
16
|
+
const x5tS256 = await certor.asSHA256();
|
|
17
|
+
return await new SignJWT(payload)
|
|
18
|
+
.setProtectedHeader({
|
|
19
|
+
alg: algorithm,
|
|
20
|
+
typ: "JWT",
|
|
21
|
+
kid: await calculateJwkThumbprint(await this.#key.publicKey(), "sha256"),
|
|
22
|
+
x5c: x5c,
|
|
23
|
+
x5t: x5t,
|
|
24
|
+
"x5t#S256": x5tS256,
|
|
25
|
+
})
|
|
26
|
+
.setIssuedAt()
|
|
27
|
+
.setExpirationTime("1h")
|
|
28
|
+
.sign(await this.#key.exportPrivateJWK());
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=sign.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign.js","sourceRoot":"","sources":["../../jsr/device-id/sign.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAqC,MAAM,MAAM,CAAC;AAE1F,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,OAAO,eAAe;IACjB,IAAI,CAAc;IAClB,KAAK,CAAqB;IAC1B,MAAM,CAAkB;IAEjC,YAAY,MAAuB,EAAE,GAAgB,EAAE,IAAwB;QAC7E,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,IAAI,CAAuB,OAAU,EAAE,SAAS,GAAG,OAAO;QAC9D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxC,OAAO,MAAM,IAAI,OAAO,CAAC,OAAyB,CAAC;aAChD,kBAAkB,CAAC;YAClB,GAAG,EAAE,SAAS;YACd,GAAG,EAAE,KAAK;YACV,GAAG,EAAE,MAAM,sBAAsB,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC;YACxE,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,GAAG;YACR,UAAU,EAAE,OAAO;SACpB,CAAC;aACD,WAAW,EAAE;aACb,iBAAiB,CAAC,IAAI,CAAC;aACvB,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC9C,CAAC;CACF"}
|
package/node.d.ts
CHANGED
|
@@ -2,7 +2,10 @@ import { Result } from "@adviser/cement";
|
|
|
2
2
|
import type { SuperThis } from "@fireproof/core-types-base";
|
|
3
3
|
import type { DashAuthType } from "@fireproof/core-types-protocols-dashboard";
|
|
4
4
|
export { getKeyBag } from "@fireproof/core-keybag";
|
|
5
|
-
export { DeviceIdKey
|
|
5
|
+
export { DeviceIdKey } from "./device-id/key.js";
|
|
6
|
+
export { DeviceIdSignMsg } from "./device-id/sign.js";
|
|
7
|
+
export { DeviceIdCSR } from "./device-id/csr.js";
|
|
8
|
+
export { DeviceIdCA } from "@fireproof/core-device-id";
|
|
6
9
|
export { deviceIdRegisterEvento, isResDeviceIdRegister } from "@fireproof/core-cli";
|
|
7
10
|
export type { ReqDeviceIdRegister } from "@fireproof/core-cli";
|
|
8
11
|
export declare function createDeviceIdGetToken(sthis: SuperThis, opts: {
|
package/node.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { Lazy, Result } from "@adviser/cement";
|
|
2
2
|
import { getKeyBag } from "@fireproof/core-keybag";
|
|
3
|
-
import { DeviceIdKey
|
|
3
|
+
import { DeviceIdKey } from "./device-id/key.js";
|
|
4
|
+
import { DeviceIdSignMsg } from "./device-id/sign.js";
|
|
4
5
|
export { getKeyBag } from "@fireproof/core-keybag";
|
|
5
|
-
export { DeviceIdKey
|
|
6
|
+
export { DeviceIdKey } from "./device-id/key.js";
|
|
7
|
+
export { DeviceIdSignMsg } from "./device-id/sign.js";
|
|
8
|
+
export { DeviceIdCSR } from "./device-id/csr.js";
|
|
9
|
+
export { DeviceIdCA } from "@fireproof/core-device-id";
|
|
6
10
|
export { deviceIdRegisterEvento, isResDeviceIdRegister } from "@fireproof/core-cli";
|
|
7
11
|
export async function createDeviceIdGetToken(sthis, opts) {
|
|
8
12
|
const kb = await getKeyBag(sthis);
|
package/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../jsr/node.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAG/C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../jsr/node.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAG/C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAMtD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAIvD,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAiBpF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAgB,EAChB,IAAoE;IAEpE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,uDAAuD,CAAC,CAAC;IACtG,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACzE,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACpB,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAG,CAAC,kBAAkB,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC5E,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,IAAI,CACT,KAAK,IAAmC,EAAE;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAC7B;YACE,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,WAAW;YAChB,QAAQ,EAAE,MAAM,OAAO,CAAC,EAAE,EAAE,CAAC,WAAW,EAAE;YAC1C,GAAG,EAAE,EAAE,GAAG;YACV,GAAG,EAAE,GAAG,GAAG,GAAG;YACd,GAAG,EAAE,GAAG,GAAG,CAAC;YACZ,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG;SACI,EAC7B,OAAO,CACR,CAAC;QACF,OAAO,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,CAAC,EACD,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CACpC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibes.diy/identity",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"exports": {
|
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
"@fireproof/core-types-base": "~0.24.19",
|
|
23
23
|
"@fireproof/core-types-device-id": "~0.24.19",
|
|
24
24
|
"@fireproof/core-types-protocols-dashboard": "~0.24.19",
|
|
25
|
+
"jose": "~6.2.2",
|
|
26
|
+
"multiformats": "~13.4.2",
|
|
25
27
|
"zod": "~4.4.3"
|
|
26
28
|
},
|
|
27
29
|
"repository": {
|