@lockerpm/desktop-service 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.
Files changed (158) hide show
  1. package/README.md +98 -0
  2. package/lib/cjs/abstractions/api.service.js +2 -0
  3. package/lib/cjs/abstractions/crypto.service.js +147 -0
  4. package/lib/cjs/abstractions/errors.js +99 -0
  5. package/lib/cjs/abstractions/event.service.js +2 -0
  6. package/lib/cjs/abstractions/index.js +2 -0
  7. package/lib/cjs/abstractions/socket.service.js +11 -0
  8. package/lib/cjs/abstractions/storage.service.js +2 -0
  9. package/lib/cjs/index.js +243 -0
  10. package/lib/cjs/misc/config.js +15 -0
  11. package/lib/cjs/misc/utils.js +37 -0
  12. package/lib/cjs/proto/google/api/annotations.js +2 -0
  13. package/lib/cjs/proto/google/api/http.js +477 -0
  14. package/lib/cjs/proto/google/protobuf/descriptor.js +4873 -0
  15. package/lib/cjs/proto/locker-service-grpc.js +1915 -0
  16. package/lib/cjs/services/api.service.js +182 -0
  17. package/lib/cjs/services/cache.service.js +50 -0
  18. package/lib/cjs/services/core-crypto.service.js +193 -0
  19. package/lib/cjs/services/crypto.service.js +101 -0
  20. package/lib/cjs/services/event.service.js +31 -0
  21. package/lib/cjs/services/fido.service.js +136 -0
  22. package/lib/cjs/services/grpc.service.js +130 -0
  23. package/lib/cjs/services/log.service.js +30 -0
  24. package/lib/cjs/services/pairing.service.js +122 -0
  25. package/lib/cjs/services/socket.service.js +280 -0
  26. package/lib/cjs/services/user.service.js +134 -0
  27. package/lib/cjs/types/abstractions/api.service.d.ts +40 -0
  28. package/lib/cjs/types/abstractions/api.service.d.ts.map +1 -0
  29. package/lib/cjs/types/abstractions/crypto.service.d.ts +46 -0
  30. package/lib/cjs/types/abstractions/crypto.service.d.ts.map +1 -0
  31. package/lib/cjs/types/abstractions/errors.d.ts +73 -0
  32. package/lib/cjs/types/abstractions/errors.d.ts.map +1 -0
  33. package/lib/cjs/types/abstractions/event.service.d.ts +23 -0
  34. package/lib/cjs/types/abstractions/event.service.d.ts.map +1 -0
  35. package/lib/cjs/types/abstractions/index.d.ts +56 -0
  36. package/lib/cjs/types/abstractions/index.d.ts.map +1 -0
  37. package/lib/cjs/types/abstractions/socket.service.d.ts +52 -0
  38. package/lib/cjs/types/abstractions/socket.service.d.ts.map +1 -0
  39. package/lib/cjs/types/abstractions/storage.service.d.ts +6 -0
  40. package/lib/cjs/types/abstractions/storage.service.d.ts.map +1 -0
  41. package/lib/cjs/types/index.d.ts +164 -0
  42. package/lib/cjs/types/index.d.ts.map +1 -0
  43. package/lib/cjs/types/misc/config.d.ts +6 -0
  44. package/lib/cjs/types/misc/config.d.ts.map +1 -0
  45. package/lib/cjs/types/misc/utils.d.ts +21 -0
  46. package/lib/cjs/types/misc/utils.d.ts.map +1 -0
  47. package/lib/cjs/types/proto/google/api/annotations.d.ts +2 -0
  48. package/lib/cjs/types/proto/google/api/annotations.d.ts.map +1 -0
  49. package/lib/cjs/types/proto/google/api/http.d.ts +195 -0
  50. package/lib/cjs/types/proto/google/api/http.d.ts.map +1 -0
  51. package/lib/cjs/types/proto/google/protobuf/descriptor.d.ts +3409 -0
  52. package/lib/cjs/types/proto/google/protobuf/descriptor.d.ts.map +1 -0
  53. package/lib/cjs/types/proto/locker-service-grpc.d.ts +622 -0
  54. package/lib/cjs/types/proto/locker-service-grpc.d.ts.map +1 -0
  55. package/lib/cjs/types/services/api.service.d.ts +37 -0
  56. package/lib/cjs/types/services/api.service.d.ts.map +1 -0
  57. package/lib/cjs/types/services/cache.service.d.ts +10 -0
  58. package/lib/cjs/types/services/cache.service.d.ts.map +1 -0
  59. package/lib/cjs/types/services/core-crypto.service.d.ts +17 -0
  60. package/lib/cjs/types/services/core-crypto.service.d.ts.map +1 -0
  61. package/lib/cjs/types/services/crypto.service.d.ts +23 -0
  62. package/lib/cjs/types/services/crypto.service.d.ts.map +1 -0
  63. package/lib/cjs/types/services/event.service.d.ts +14 -0
  64. package/lib/cjs/types/services/event.service.d.ts.map +1 -0
  65. package/lib/cjs/types/services/fido.service.d.ts +40 -0
  66. package/lib/cjs/types/services/fido.service.d.ts.map +1 -0
  67. package/lib/cjs/types/services/grpc.service.d.ts +34 -0
  68. package/lib/cjs/types/services/grpc.service.d.ts.map +1 -0
  69. package/lib/cjs/types/services/log.service.d.ts +13 -0
  70. package/lib/cjs/types/services/log.service.d.ts.map +1 -0
  71. package/lib/cjs/types/services/pairing.service.d.ts +37 -0
  72. package/lib/cjs/types/services/pairing.service.d.ts.map +1 -0
  73. package/lib/cjs/types/services/socket.service.d.ts +39 -0
  74. package/lib/cjs/types/services/socket.service.d.ts.map +1 -0
  75. package/lib/cjs/types/services/user.service.d.ts +32 -0
  76. package/lib/cjs/types/services/user.service.d.ts.map +1 -0
  77. package/lib/cjs/types/usecases/fido.d.ts +54 -0
  78. package/lib/cjs/types/usecases/fido.d.ts.map +1 -0
  79. package/lib/cjs/usecases/fido.js +227 -0
  80. package/lib/esm/abstractions/api.service.js +2 -0
  81. package/lib/esm/abstractions/crypto.service.js +165 -0
  82. package/lib/esm/abstractions/errors.js +100 -0
  83. package/lib/esm/abstractions/event.service.js +2 -0
  84. package/lib/esm/abstractions/index.js +2 -0
  85. package/lib/esm/abstractions/socket.service.js +11 -0
  86. package/lib/esm/abstractions/storage.service.js +2 -0
  87. package/lib/esm/index.mjs +227 -0
  88. package/lib/esm/misc/config.js +15 -0
  89. package/lib/esm/misc/utils.js +37 -0
  90. package/lib/esm/proto/google/api/annotations.js +2 -0
  91. package/lib/esm/proto/google/api/http.js +468 -0
  92. package/lib/esm/proto/google/protobuf/descriptor.js +4830 -0
  93. package/lib/esm/proto/locker-service-grpc.js +1892 -0
  94. package/lib/esm/services/api.service.js +177 -0
  95. package/lib/esm/services/cache.service.js +52 -0
  96. package/lib/esm/services/core-crypto.service.js +164 -0
  97. package/lib/esm/services/crypto.service.js +83 -0
  98. package/lib/esm/services/event.service.js +33 -0
  99. package/lib/esm/services/fido.service.js +139 -0
  100. package/lib/esm/services/grpc.service.js +119 -0
  101. package/lib/esm/services/log.service.js +31 -0
  102. package/lib/esm/services/pairing.service.js +107 -0
  103. package/lib/esm/services/socket.service.js +265 -0
  104. package/lib/esm/services/user.service.js +116 -0
  105. package/lib/esm/types/abstractions/api.service.d.ts +40 -0
  106. package/lib/esm/types/abstractions/api.service.d.ts.map +1 -0
  107. package/lib/esm/types/abstractions/crypto.service.d.ts +46 -0
  108. package/lib/esm/types/abstractions/crypto.service.d.ts.map +1 -0
  109. package/lib/esm/types/abstractions/errors.d.ts +73 -0
  110. package/lib/esm/types/abstractions/errors.d.ts.map +1 -0
  111. package/lib/esm/types/abstractions/event.service.d.ts +23 -0
  112. package/lib/esm/types/abstractions/event.service.d.ts.map +1 -0
  113. package/lib/esm/types/abstractions/index.d.ts +56 -0
  114. package/lib/esm/types/abstractions/index.d.ts.map +1 -0
  115. package/lib/esm/types/abstractions/socket.service.d.ts +52 -0
  116. package/lib/esm/types/abstractions/socket.service.d.ts.map +1 -0
  117. package/lib/esm/types/abstractions/storage.service.d.ts +6 -0
  118. package/lib/esm/types/abstractions/storage.service.d.ts.map +1 -0
  119. package/lib/esm/types/index.d.ts +164 -0
  120. package/lib/esm/types/index.d.ts.map +1 -0
  121. package/lib/esm/types/misc/config.d.ts +6 -0
  122. package/lib/esm/types/misc/config.d.ts.map +1 -0
  123. package/lib/esm/types/misc/utils.d.ts +21 -0
  124. package/lib/esm/types/misc/utils.d.ts.map +1 -0
  125. package/lib/esm/types/proto/google/api/annotations.d.ts +2 -0
  126. package/lib/esm/types/proto/google/api/annotations.d.ts.map +1 -0
  127. package/lib/esm/types/proto/google/api/http.d.ts +195 -0
  128. package/lib/esm/types/proto/google/api/http.d.ts.map +1 -0
  129. package/lib/esm/types/proto/google/protobuf/descriptor.d.ts +3409 -0
  130. package/lib/esm/types/proto/google/protobuf/descriptor.d.ts.map +1 -0
  131. package/lib/esm/types/proto/locker-service-grpc.d.ts +622 -0
  132. package/lib/esm/types/proto/locker-service-grpc.d.ts.map +1 -0
  133. package/lib/esm/types/services/api.service.d.ts +37 -0
  134. package/lib/esm/types/services/api.service.d.ts.map +1 -0
  135. package/lib/esm/types/services/cache.service.d.ts +10 -0
  136. package/lib/esm/types/services/cache.service.d.ts.map +1 -0
  137. package/lib/esm/types/services/core-crypto.service.d.ts +17 -0
  138. package/lib/esm/types/services/core-crypto.service.d.ts.map +1 -0
  139. package/lib/esm/types/services/crypto.service.d.ts +23 -0
  140. package/lib/esm/types/services/crypto.service.d.ts.map +1 -0
  141. package/lib/esm/types/services/event.service.d.ts +14 -0
  142. package/lib/esm/types/services/event.service.d.ts.map +1 -0
  143. package/lib/esm/types/services/fido.service.d.ts +40 -0
  144. package/lib/esm/types/services/fido.service.d.ts.map +1 -0
  145. package/lib/esm/types/services/grpc.service.d.ts +34 -0
  146. package/lib/esm/types/services/grpc.service.d.ts.map +1 -0
  147. package/lib/esm/types/services/log.service.d.ts +13 -0
  148. package/lib/esm/types/services/log.service.d.ts.map +1 -0
  149. package/lib/esm/types/services/pairing.service.d.ts +37 -0
  150. package/lib/esm/types/services/pairing.service.d.ts.map +1 -0
  151. package/lib/esm/types/services/socket.service.d.ts +39 -0
  152. package/lib/esm/types/services/socket.service.d.ts.map +1 -0
  153. package/lib/esm/types/services/user.service.d.ts +32 -0
  154. package/lib/esm/types/services/user.service.d.ts.map +1 -0
  155. package/lib/esm/types/usecases/fido.d.ts +54 -0
  156. package/lib/esm/types/usecases/fido.d.ts.map +1 -0
  157. package/lib/esm/usecases/fido.js +201 -0
  158. package/package.json +55 -0
@@ -0,0 +1,37 @@
1
+ import { LogService } from './log.service';
2
+ import { OS } from '../misc/utils';
3
+ import { BackupKey, GetPublicPwlCredentialResponse, GetReleasesResponse, SetBackupPwlParams, PasswordlessType } from '../abstractions/api.service';
4
+ export declare class ApiService {
5
+ baseUrl: string;
6
+ token: string;
7
+ headers: {
8
+ [key: string]: string;
9
+ };
10
+ private logger;
11
+ constructor(params: {
12
+ baseUrl: string;
13
+ logger: LogService;
14
+ headers?: {
15
+ [key: string]: string;
16
+ };
17
+ });
18
+ setToken(token: string): void;
19
+ getPasswordlessCredentials(email: string): Promise<GetPublicPwlCredentialResponse>;
20
+ getReleases(os: OS): Promise<GetReleasesResponse>;
21
+ setPasswordlessCredential(params: {
22
+ credentialId: string;
23
+ name: string;
24
+ type: PasswordlessType;
25
+ random?: string;
26
+ }): Promise<{
27
+ random: string;
28
+ }>;
29
+ deletePasswordlessCredential(): Promise<void>;
30
+ listBackupPasswordlessCredentials(): Promise<BackupKey[]>;
31
+ setBackupPasswordlessCredential(payload: SetBackupPwlParams): Promise<{
32
+ id: string;
33
+ }>;
34
+ deleteBackupPasswordlessCredential(id: string): Promise<void>;
35
+ private logDebug;
36
+ }
37
+ //# sourceMappingURL=api.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.service.d.ts","sourceRoot":"","sources":["../../../../src/services/api.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAA;AAClC,OAAO,EACL,SAAS,EACT,8BAA8B,EAC9B,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,6BAA6B,CAAA;AAEpC,qBAAa,UAAU;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;IAElC,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE;QAClB,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,UAAU,CAAA;QAClB,OAAO,CAAC,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,CAAA;KACpC;IAQD,QAAQ,CAAC,KAAK,EAAE,MAAM;IAIhB,0BAA0B,CAAC,KAAK,EAAE,MAAM;IAqBxC,WAAW,CAAC,EAAE,EAAE,EAAE;IAkBlB,yBAAyB,CAAC,MAAM,EAAE;QACtC,YAAY,EAAE,MAAM,CAAA;QACpB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,gBAAgB,CAAA;QACtB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB;gBAsByB,MAAM;;IAQ1B,4BAA4B;IAwB5B,iCAAiC;IAuBjC,+BAA+B,CAAC,OAAO,EAAE,kBAAkB;YAapC,MAAM;;IAM7B,kCAAkC,CAAC,EAAE,EAAE,MAAM;IAmBnD,OAAO,CAAC,QAAQ;CAMjB"}
@@ -0,0 +1,10 @@
1
+ import { LogService } from './log.service';
2
+ import { GRPCService } from './grpc.service';
3
+ export declare class CacheService {
4
+ private logger;
5
+ private grpc;
6
+ constructor(logger: LogService, grpcService: GRPCService);
7
+ getCache(): Promise<any>;
8
+ setCache(data: any): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=cache.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.service.d.ts","sourceRoot":"","sources":["../../../../src/services/cache.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAQ5C,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,IAAI,CAAa;gBAEb,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW;IAKxD,QAAQ;IAmBR,QAAQ,CAAC,IAAI,EAAE,GAAG;CAenB"}
@@ -0,0 +1,17 @@
1
+ import { KdfType, SymmetricCryptoKey, EncString } from '../abstractions/crypto.service';
2
+ export declare class CoreCryptoService {
3
+ makeKey(password: string, salt: string, kdf: KdfType, kdfIterations: number): Promise<SymmetricCryptoKey>;
4
+ hashPassword(password: string, key: SymmetricCryptoKey): Promise<string>;
5
+ remakeEncKey(currentEncKey: ArrayBuffer, key: SymmetricCryptoKey): Promise<[SymmetricCryptoKey, EncString]>;
6
+ private pbkdf2;
7
+ private toBuf;
8
+ private toWebCryptoAlgorithm;
9
+ private stretchKey;
10
+ private hkdfExpand;
11
+ private hmac;
12
+ private encrypt;
13
+ private aesEncrypt;
14
+ private randomBytes;
15
+ private _aesEncrypt;
16
+ }
17
+ //# sourceMappingURL=core-crypto.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-crypto.service.d.ts","sourceRoot":"","sources":["../../../../src/services/core-crypto.service.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,OAAO,EACP,kBAAkB,EAClB,SAAS,EAEV,MAAM,gCAAgC,CAAA;AAKvC,qBAAa,iBAAiB;IACtB,OAAO,CACX,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,OAAO,EACZ,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,kBAAkB,CAAC;IAexB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAQxE,YAAY,CAChB,aAAa,EAAE,WAAW,EAC1B,GAAG,EAAE,kBAAkB,GACtB,OAAO,CAAC,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;YAe7B,MAAM;IA2BpB,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,oBAAoB;YAOd,UAAU;YASV,UAAU;YAmCV,IAAI;YAaJ,OAAO;YAkBP,UAAU;IAgBxB,OAAO,CAAC,WAAW;YAIL,WAAW;CAU1B"}
@@ -0,0 +1,23 @@
1
+ /// <reference types="node" />
2
+ import c from 'crypto';
3
+ import { CoreCryptoService } from './core-crypto.service';
4
+ type CryptoKey = c.webcrypto.CryptoKey;
5
+ export declare class CryptoService {
6
+ core: CoreCryptoService;
7
+ constructor();
8
+ createECDHKeyPair(): Promise<{
9
+ publicKey: string;
10
+ privateKey: c.webcrypto.CryptoKey;
11
+ }>;
12
+ createEncKey(theirPublicKey: string, ourPrivateKey: CryptoKey): Promise<{
13
+ encKey: string;
14
+ approveCode: string;
15
+ }>;
16
+ aesEncrypt(data: string, key: string): Promise<string>;
17
+ aesDecrypt(data: string, key: string): Promise<string>;
18
+ getFileChecksum(path: string): Promise<string>;
19
+ getRandomValues(length: number): Uint8Array;
20
+ private createECDHSharedSecret;
21
+ }
22
+ export {};
23
+ //# sourceMappingURL=crypto.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.service.d.ts","sourceRoot":"","sources":["../../../../src/services/crypto.service.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AAItB,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAEzD,KAAK,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;AAGtC,qBAAa,aAAa;IACxB,IAAI,EAAE,iBAAiB,CAAA;;IAMjB,iBAAiB;;;;IASjB,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS;;;;IAS7D,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAiBpC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAiB1C,eAAe,CAAC,IAAI,EAAE,MAAM;IAY5B,eAAe,CAAC,MAAM,EAAE,MAAM;YAMhB,sBAAsB;CAkBrC"}
@@ -0,0 +1,14 @@
1
+ import EventEmitter from 'eventemitter3';
2
+ import { LogService } from './log.service';
3
+ import { EventArguments, Event } from '../abstractions/event.service';
4
+ export declare class EventService {
5
+ private events;
6
+ private logger;
7
+ constructor(logger: LogService);
8
+ emit<E extends Event>(event: E, args: EventArguments[E]): boolean;
9
+ on<E extends Event>(event: E, handler: (args: EventArguments[E]) => void): EventEmitter<string | symbol, any>;
10
+ once<E extends Event>(event: E, handler: (args: EventArguments[E]) => void): EventEmitter<string | symbol, any>;
11
+ removeListener<E extends Event>(event: E, handler: (args: EventArguments[E]) => void): void;
12
+ removeAllListeners(): void;
13
+ }
14
+ //# sourceMappingURL=event.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.service.d.ts","sourceRoot":"","sources":["../../../../src/services/event.service.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAA;AAErE,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,UAAU;IAK9B,IAAI,CAAC,CAAC,SAAS,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IAMvD,EAAE,CAAC,CAAC,SAAS,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI;IAIxE,IAAI,CAAC,CAAC,SAAS,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI;IAI1E,cAAc,CAAC,CAAC,SAAS,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI;IAIpF,kBAAkB;CAGnB"}
@@ -0,0 +1,40 @@
1
+ import { LogService } from './log.service';
2
+ import { EventService } from './event.service';
3
+ import { GRPCService } from './grpc.service';
4
+ export declare class FidoService {
5
+ private logger;
6
+ private eventEmitter;
7
+ private grpc;
8
+ constructor(logger: LogService, eventEmitter: EventService, grpcService: GRPCService);
9
+ getDeviceList(): Promise<{
10
+ name: string;
11
+ path: string;
12
+ }[]>;
13
+ setSelectedDevice(path: string): Promise<boolean>;
14
+ listCredentials(params: {
15
+ pin: string;
16
+ }): Promise<{
17
+ name: string;
18
+ displayName: string;
19
+ credentialId: string;
20
+ }[]>;
21
+ makeCredential(params: {
22
+ email: string;
23
+ name: string;
24
+ pin?: string;
25
+ }): Promise<{
26
+ credentialId: string | undefined;
27
+ }>;
28
+ deleteCredential(params: {
29
+ credentialId: string;
30
+ pin: string;
31
+ }): Promise<boolean>;
32
+ getHmacSecret(params: {
33
+ credentialId: string;
34
+ salt: string;
35
+ pin?: string;
36
+ }): Promise<{
37
+ secret: string;
38
+ }>;
39
+ }
40
+ //# sourceMappingURL=fido.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fido.service.d.ts","sourceRoot":"","sources":["../../../../src/services/fido.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAY5C,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,IAAI,CAAa;gBAEb,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW;IAMpF,aAAa;cAGgB,MAAM;cAAQ,MAAM;;IAqBjD,iBAAiB,CAAC,IAAI,EAAE,MAAM;IAgB9B,eAAe,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE;cAIV,MAAM;qBAAe,MAAM;sBAAgB,MAAM;;IAoB9E,cAAc,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE;sBAO/B,MAAM,GAAG,SAAS;;IAcvD,gBAAgB,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;IAiB9D,aAAa,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE;gBAW3C,MAAM;;CAatC"}
@@ -0,0 +1,34 @@
1
+ /// <reference types="node" />
2
+ import { locker_service_grpc } from '../proto/locker-service-grpc';
3
+ import { LogService } from './log.service';
4
+ import { CryptoService } from './crypto.service';
5
+ import { ApiService } from './api.service';
6
+ export declare class GRPCService {
7
+ client: locker_service_grpc.LockerServiceClient;
8
+ currentPort: number;
9
+ private logger;
10
+ private crypto;
11
+ private api;
12
+ private serviceChecksums;
13
+ private credentials;
14
+ private unsafe;
15
+ private serviceAlias;
16
+ constructor(services: {
17
+ logger: LogService;
18
+ cryptoService: CryptoService;
19
+ apiService: ApiService;
20
+ }, options: {
21
+ ssl?: {
22
+ rootCert: Buffer;
23
+ };
24
+ unsafe?: boolean;
25
+ serviceAlias: string;
26
+ });
27
+ get isReady(): boolean;
28
+ initConnection(): Promise<void>;
29
+ private pingService;
30
+ private testConnection;
31
+ private validateConnection;
32
+ private loadServiceChecksums;
33
+ }
34
+ //# sourceMappingURL=grpc.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grpc.service.d.ts","sourceRoot":"","sources":["../../../../src/services/grpc.service.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAK1C,qBAAa,WAAW;IACtB,MAAM,EAAE,mBAAmB,CAAC,mBAAmB,CAAA;IAC/C,WAAW,SAAI;IAEf,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,GAAG,CAAY;IAEvB,OAAO,CAAC,gBAAgB,CAAe;IACvC,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAK;gBAGvB,QAAQ,EAAE;QACR,MAAM,EAAE,UAAU,CAAA;QAClB,aAAa,EAAE,aAAa,CAAA;QAC5B,UAAU,EAAE,UAAU,CAAA;KACvB,EACD,OAAO,EAAE;QACP,GAAG,CAAC,EAAE;YACJ,QAAQ,EAAE,MAAM,CAAA;SACjB,CAAA;QACD,MAAM,CAAC,EAAE,OAAO,CAAA;QAChB,YAAY,EAAE,MAAM,CAAA;KACrB;IAmBH,IAAI,OAAO,YAEV;IAEK,cAAc;YA2BN,WAAW;IAkBzB,OAAO,CAAC,cAAc;YAgBR,kBAAkB;YAgBlB,oBAAoB;CAKnC"}
@@ -0,0 +1,13 @@
1
+ export declare enum LogLevel {
2
+ NONE = 0,
3
+ ERROR = 1,
4
+ DEBUG = 2
5
+ }
6
+ export declare class LogService {
7
+ logLevel: LogLevel;
8
+ constructor(logLevel?: LogLevel);
9
+ setLogLevel(level: LogLevel): void;
10
+ debug(e: any): void;
11
+ error(e: any): void;
12
+ }
13
+ //# sourceMappingURL=log.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.service.d.ts","sourceRoot":"","sources":["../../../../src/services/log.service.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,IAAI,IAAI;IACR,KAAK,IAAI;IACT,KAAK,IAAI;CACV;AAED,qBAAa,UAAU;IACrB,QAAQ,EAAE,QAAQ,CAAA;gBAEN,QAAQ,CAAC,EAAE,QAAQ;IAI/B,WAAW,CAAC,KAAK,EAAE,QAAQ;IAI3B,KAAK,CAAC,CAAC,EAAE,GAAG;IAOZ,KAAK,CAAC,CAAC,EAAE,GAAG;CAMb"}
@@ -0,0 +1,37 @@
1
+ import { ClientType } from '../abstractions';
2
+ import { IStorageService } from '../abstractions/storage.service';
3
+ import { CryptoService } from './crypto.service';
4
+ import { EventService } from './event.service';
5
+ import { GRPCService } from './grpc.service';
6
+ import { LogService } from './log.service';
7
+ type ClientInfo = {
8
+ encKey: string;
9
+ confirmed: boolean;
10
+ };
11
+ export declare class PairingService {
12
+ private crypto;
13
+ private storage;
14
+ private events;
15
+ private logger;
16
+ private grpc;
17
+ private clients;
18
+ isReady: boolean;
19
+ constructor(services: {
20
+ cryptoService: CryptoService;
21
+ eventService: EventService;
22
+ storageService: IStorageService;
23
+ grpcService: GRPCService;
24
+ logger: LogService;
25
+ });
26
+ getClient(clientId: string): ClientInfo;
27
+ isClientConfirmed(clientId: string): boolean;
28
+ getResponseForPairingRequest(clientId: string, publicKey: string, clientType: ClientType): Promise<import("../abstractions/socket.service").OutgoingEnvelop<import("../abstractions/socket.service").OutgoingMessageType>>;
29
+ confirmPairingClient(clientId: string, keepInKeyring?: boolean): Promise<void>;
30
+ encryptDataForClient(clientId: string, data: string): Promise<string>;
31
+ decryptDataFromClient(clientId: string, data: string): Promise<string>;
32
+ private registerClientOnService;
33
+ private loadFromStore;
34
+ private saveToStore;
35
+ }
36
+ export {};
37
+ //# sourceMappingURL=pairing.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairing.service.d.ts","sourceRoot":"","sources":["../../../../src/services/pairing.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAG5C,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAI1C,KAAK,UAAU,GAAG;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,IAAI,CAAa;IAEzB,OAAO,CAAC,OAAO,CAET;IAEN,OAAO,UAAQ;gBAEH,QAAQ,EAAE;QACpB,aAAa,EAAE,aAAa,CAAA;QAC5B,YAAY,EAAE,YAAY,CAAA;QAC1B,cAAc,EAAE,eAAe,CAAA;QAC/B,WAAW,EAAE,WAAW,CAAA;QACxB,MAAM,EAAE,UAAU,CAAA;KACnB;IAUD,SAAS,CAAC,QAAQ,EAAE,MAAM;IAI1B,iBAAiB,CAAC,QAAQ,EAAE,MAAM;IAI5B,4BAA4B,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU;IAkBxF,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO;IAS9D,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IASnD,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAS1D,OAAO,CAAC,uBAAuB;YAmBjB,aAAa;IAc3B,OAAO,CAAC,WAAW;CAGpB"}
@@ -0,0 +1,39 @@
1
+ /// <reference types="node" />
2
+ import { LogService } from './log.service';
3
+ import { PairingService } from './pairing.service';
4
+ import { OutgoingEnvelop, OutgoingMessageType } from '../abstractions/socket.service';
5
+ import { UserService } from './user.service';
6
+ import { EventService } from './event.service';
7
+ export declare class SocketService {
8
+ private logger;
9
+ private pairingService;
10
+ private userService;
11
+ private eventService;
12
+ private sslConfig;
13
+ private server;
14
+ private clients;
15
+ private serviceAlias;
16
+ currentPort: number;
17
+ currentSslPort: number;
18
+ constructor(params: {
19
+ logger: LogService;
20
+ pairingService: PairingService;
21
+ userService: UserService;
22
+ eventService: EventService;
23
+ ssl?: {
24
+ cert: Buffer;
25
+ key: Buffer;
26
+ };
27
+ serviceAlias: string;
28
+ });
29
+ get isReady(): boolean;
30
+ sendMessageToClient(clientId: string, envelop: OutgoingEnvelop<OutgoingMessageType>): Promise<void>;
31
+ broadcastMessageToAll(envelop: OutgoingEnvelop<OutgoingMessageType>): void;
32
+ broadcastToAllExcept(clientId: string, envelop: OutgoingEnvelop<OutgoingMessageType>): void;
33
+ initSocket(): Promise<void>;
34
+ initSslSocket(): Promise<void>;
35
+ private initSocketOnPort;
36
+ private sendMessage;
37
+ private handleMessage;
38
+ }
39
+ //# sourceMappingURL=socket.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket.service.d.ts","sourceRoot":"","sources":["../../../../src/services/socket.service.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAIL,eAAe,EACf,mBAAmB,EAEpB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAM9C,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAAc;IAElC,OAAO,CAAC,SAAS,CAKQ;IACzB,OAAO,CAAC,MAAM,CAAyC;IACvD,OAAO,CAAC,OAAO,CAET;IACN,OAAO,CAAC,YAAY,CAAK;IAEzB,WAAW,SAAI;IACf,cAAc,SAAI;gBAEN,MAAM,EAAE;QAClB,MAAM,EAAE,UAAU,CAAA;QAClB,cAAc,EAAE,cAAc,CAAA;QAC9B,WAAW,EAAE,WAAW,CAAA;QACxB,YAAY,EAAE,YAAY,CAAA;QAC1B,GAAG,CAAC,EAAE;YACJ,IAAI,EAAE,MAAM,CAAA;YACZ,GAAG,EAAE,MAAM,CAAA;SACZ,CAAA;QACD,YAAY,EAAE,MAAM,CAAA;KACrB;IAaD,IAAI,OAAO,YAIV;IAEK,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,mBAAmB,CAAC;IAsBzF,qBAAqB,CAAC,OAAO,EAAE,eAAe,CAAC,mBAAmB,CAAC;IAWnE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,mBAAmB,CAAC;IAa9E,UAAU;IAeV,aAAa;IAiBnB,OAAO,CAAC,gBAAgB;IAkFxB,OAAO,CAAC,WAAW;YAKL,aAAa;CAoG5B"}
@@ -0,0 +1,32 @@
1
+ import { IStorageService } from '../abstractions/storage.service';
2
+ import { GRPCService } from './grpc.service';
3
+ import { LogService } from './log.service';
4
+ export type UserCredentials = {
5
+ email: string;
6
+ key: string;
7
+ hashedPassword: string;
8
+ };
9
+ export declare class UserService {
10
+ private logger;
11
+ private storage;
12
+ private grpc;
13
+ currentUser: UserCredentials | null;
14
+ isLocked: boolean;
15
+ isReady: boolean;
16
+ constructor(services: {
17
+ logger: LogService;
18
+ storageService: IStorageService;
19
+ grpcService: GRPCService;
20
+ });
21
+ login(data: UserCredentials): Promise<void>;
22
+ logout(localOnly?: boolean): Promise<void>;
23
+ lock(localOnly?: boolean): Promise<void>;
24
+ getCurrentUser(): Promise<UserCredentials | null>;
25
+ private getCurrentUserFromService;
26
+ private loginService;
27
+ private logoutService;
28
+ private setUser;
29
+ private loadFromStore;
30
+ private saveToStore;
31
+ }
32
+ //# sourceMappingURL=user.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.service.d.ts","sourceRoot":"","sources":["../../../../src/services/user.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAEjE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAS1C,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,IAAI,CAAa;IAEzB,WAAW,EAAE,eAAe,GAAG,IAAI,CAAO;IAC1C,QAAQ,UAAO;IACf,OAAO,UAAQ;gBAEH,QAAQ,EAAE;QACpB,MAAM,EAAE,UAAU,CAAA;QAClB,cAAc,EAAE,eAAe,CAAA;QAC/B,WAAW,EAAE,WAAW,CAAA;KACzB;IAQK,KAAK,CAAC,IAAI,EAAE,eAAe;IAK3B,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO;IAS1B,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO;IAKxB,cAAc;IAQpB,OAAO,CAAC,yBAAyB;IAuBjC,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,aAAa;YAeP,OAAO;YAKP,aAAa;IAQ3B,OAAO,CAAC,WAAW;CAGpB"}
@@ -0,0 +1,54 @@
1
+ import { ApiService } from '../services/api.service';
2
+ import { CryptoService } from '../services/crypto.service';
3
+ import { FidoService } from '../services/fido.service';
4
+ import { LogService } from '../services/log.service';
5
+ /**
6
+ * Set pwl using fido
7
+ * @param params
8
+ * @param services
9
+ * @returns secret
10
+ */
11
+ export declare function setNewPasswordless(params: {
12
+ devicePath: string;
13
+ deviceName: string;
14
+ email: string;
15
+ name: string;
16
+ pin?: string;
17
+ }, services: {
18
+ apiService: ApiService;
19
+ fidoService: FidoService;
20
+ }): Promise<string>;
21
+ /**
22
+ * Set backup pwl using fido key
23
+ * @param params
24
+ * @param services
25
+ * @returns secret
26
+ */
27
+ export declare function setBackupPasswordless(params: {
28
+ deviceName: string;
29
+ devicePath: string;
30
+ email: string;
31
+ name: string;
32
+ currentEncKey: ArrayBuffer;
33
+ pin?: string | undefined;
34
+ }, services: {
35
+ apiService: ApiService;
36
+ fidoService: FidoService;
37
+ cryptoService: CryptoService;
38
+ }): Promise<string>;
39
+ /**
40
+ * Get pwl from fido key
41
+ * @param params
42
+ * @returns secret
43
+ */
44
+ export declare function getPasswordless(params: {
45
+ email: string;
46
+ pin?: string;
47
+ devicePath: string;
48
+ onlyBackup?: boolean;
49
+ }, services: {
50
+ apiService: ApiService;
51
+ fidoService: FidoService;
52
+ logService: LogService;
53
+ }): Promise<string>;
54
+ //# sourceMappingURL=fido.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fido.d.ts","sourceRoot":"","sources":["../../../../src/usecases/fido.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEpD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE;IACN,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,EACD,QAAQ,EAAE;IACR,UAAU,EAAE,UAAU,CAAA;IACtB,WAAW,EAAE,WAAW,CAAA;CACzB,mBA8BF;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE;IACN,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,WAAW,CAAA;IAC1B,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACzB,EACD,QAAQ,EAAE;IACR,UAAU,EAAE,UAAU,CAAA;IACtB,WAAW,EAAE,WAAW,CAAA;IACxB,aAAa,EAAE,aAAa,CAAA;CAC7B,mBAgDF;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE;IACN,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,EACD,QAAQ,EAAE;IACR,UAAU,EAAE,UAAU,CAAA;IACtB,WAAW,EAAE,WAAW,CAAA;IACxB,UAAU,EAAE,UAAU,CAAA;CACvB,mBAyGF"}
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPasswordless = exports.setBackupPasswordless = exports.setNewPasswordless = void 0;
4
+ const errors_1 = require("../abstractions/errors");
5
+ const utils_1 = require("../misc/utils");
6
+ /**
7
+ * Set pwl using fido
8
+ * @param params
9
+ * @param services
10
+ * @returns secret
11
+ */
12
+ async function setNewPasswordless(params, services) {
13
+ const { apiService, fidoService } = services;
14
+ if (!apiService.token) {
15
+ throw new errors_1.ServiceError('1001');
16
+ }
17
+ const { devicePath, deviceName, email, name, pin } = params;
18
+ const isConnected = await fidoService.setSelectedDevice(devicePath);
19
+ if (!isConnected) {
20
+ throw new errors_1.ServiceError('2001');
21
+ }
22
+ const { credentialId } = await fidoService.makeCredential({
23
+ email,
24
+ name,
25
+ pin,
26
+ });
27
+ if (!credentialId) {
28
+ throw new errors_1.ServiceError('2002');
29
+ }
30
+ const { random } = await apiService.setPasswordlessCredential({
31
+ credentialId,
32
+ name: deviceName,
33
+ type: 'hmac',
34
+ });
35
+ const { secret } = await fidoService.getHmacSecret({
36
+ credentialId,
37
+ salt: random,
38
+ pin,
39
+ });
40
+ return secret;
41
+ }
42
+ exports.setNewPasswordless = setNewPasswordless;
43
+ /**
44
+ * Set backup pwl using fido key
45
+ * @param params
46
+ * @param services
47
+ * @returns secret
48
+ */
49
+ async function setBackupPasswordless(params, services) {
50
+ const { apiService, fidoService, cryptoService } = services;
51
+ if (!apiService.token) {
52
+ throw new errors_1.ServiceError('1001');
53
+ }
54
+ const { deviceName, devicePath, email, name, pin, currentEncKey } = params;
55
+ const isConnected = await fidoService.setSelectedDevice(devicePath);
56
+ if (!isConnected) {
57
+ throw new errors_1.ServiceError('2001');
58
+ }
59
+ // Create credential
60
+ const { credentialId } = await fidoService.makeCredential({
61
+ email,
62
+ name,
63
+ pin,
64
+ });
65
+ if (!credentialId) {
66
+ throw new errors_1.ServiceError('2002');
67
+ }
68
+ // Create HMAC secret
69
+ const random = utils_1.Utils.fromBufferToHex(cryptoService.getRandomValues(16));
70
+ const { secret } = await fidoService.getHmacSecret({
71
+ credentialId,
72
+ salt: random,
73
+ pin,
74
+ });
75
+ // Create new encrypted key hash and password hash
76
+ const kdf = 0;
77
+ const kdfIterations = 100000;
78
+ const key = await cryptoService.core.makeKey(secret, email, kdf, kdfIterations);
79
+ const newPwHash = await cryptoService.core.hashPassword(secret, key);
80
+ const encKey = await cryptoService.core.remakeEncKey(currentEncKey, key);
81
+ // Send API
82
+ await apiService.setBackupPasswordlessCredential({
83
+ fd_credential_id: credentialId,
84
+ fd_random: random,
85
+ key: encKey[1].encryptedString || '',
86
+ master_password_hash: newPwHash,
87
+ name: deviceName,
88
+ type: 'hmac',
89
+ });
90
+ return secret;
91
+ }
92
+ exports.setBackupPasswordless = setBackupPasswordless;
93
+ /**
94
+ * Get pwl from fido key
95
+ * @param params
96
+ * @returns secret
97
+ */
98
+ async function getPasswordless(params, services) {
99
+ const { fidoService, apiService, logService } = services;
100
+ const { email, pin, devicePath, onlyBackup } = params;
101
+ // Select FIDO device
102
+ const isConnected = await fidoService.setSelectedDevice(devicePath);
103
+ if (!isConnected) {
104
+ throw new errors_1.ServiceError('2001');
105
+ }
106
+ // Get cred + random from API
107
+ const { backup_keys, ...mainKey } = await apiService.getPasswordlessCredentials(email);
108
+ const validBackupKeys = backup_keys.filter((k) => k.type !== 'prf');
109
+ const isMainKeyValid = mainKey.type !== 'prf' && !!mainKey.credential_id && !!mainKey.random;
110
+ if (!isMainKeyValid && !validBackupKeys.length) {
111
+ throw new errors_1.ServiceError('1002');
112
+ }
113
+ // If the user provides PIN, check for required cred by listing all residental keys
114
+ if (pin) {
115
+ let matchingCredId = '';
116
+ let matchingCredRandom = '';
117
+ const validCreds = validBackupKeys.map((k) => ({
118
+ credential_id: k.credential_id,
119
+ random: k.random,
120
+ }));
121
+ if (isMainKeyValid) {
122
+ validCreds.push({
123
+ credential_id: mainKey.credential_id,
124
+ random: mainKey.random,
125
+ });
126
+ }
127
+ try {
128
+ const residentalCreds = await fidoService.listCredentials({ pin });
129
+ const existingCredIds = residentalCreds.map((c) => c.credentialId);
130
+ const matchingCred = validCreds.find((c) => existingCredIds.includes(c.credential_id));
131
+ if (!matchingCred) {
132
+ // TODO: There is a case where the key setup before is not a residental key
133
+ // Temporary ignore this and proceed with trying each cred
134
+ // throw new ServiceError('2005')
135
+ }
136
+ else {
137
+ matchingCredId = matchingCred.credential_id;
138
+ matchingCredRandom = matchingCred.random;
139
+ }
140
+ }
141
+ catch (e) {
142
+ const err = e;
143
+ if (['2003', '2004', '2005'].includes(err.code)) {
144
+ throw err;
145
+ }
146
+ // Some keys do not allow this action -> ignore error here
147
+ logService.debug(e);
148
+ }
149
+ if (matchingCredId) {
150
+ const { secret } = await fidoService.getHmacSecret({
151
+ credentialId: matchingCredId,
152
+ salt: matchingCredRandom,
153
+ pin,
154
+ });
155
+ return secret;
156
+ }
157
+ }
158
+ // Try main key first
159
+ if (!onlyBackup && isMainKeyValid) {
160
+ try {
161
+ const { secret } = await fidoService.getHmacSecret({
162
+ credentialId: mainKey.credential_id,
163
+ salt: mainKey.random,
164
+ pin,
165
+ });
166
+ return secret;
167
+ }
168
+ catch (error) {
169
+ const err = error;
170
+ if (err.code === '2006' && validBackupKeys?.length) {
171
+ logService.debug('Main cred not found, try backup creds');
172
+ }
173
+ else {
174
+ throw err;
175
+ }
176
+ }
177
+ }
178
+ // Try backup keys
179
+ for (const key of validBackupKeys) {
180
+ try {
181
+ const { secret } = await fidoService.getHmacSecret({
182
+ credentialId: key.credential_id,
183
+ salt: key.random,
184
+ pin,
185
+ });
186
+ return secret;
187
+ }
188
+ catch (error) {
189
+ const err = error;
190
+ if (err.code === '2006') {
191
+ continue;
192
+ }
193
+ else {
194
+ throw error;
195
+ }
196
+ }
197
+ }
198
+ // No cred is valid
199
+ throw new errors_1.ServiceError('2005');
200
+ }
201
+ exports.getPasswordless = getPasswordless;