Skip to content

Commit 22f24ad

Browse files
Berend Sliedrechtberendsliedrecht
authored andcommitted
feat: batch generate key pair
Signed-off-by: Berend Sliedrecht <[email protected]>
1 parent a822967 commit 22f24ad

File tree

3 files changed

+69
-7
lines changed

3 files changed

+69
-7
lines changed

biome.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,12 @@
2525
"enabled": true
2626
},
2727
"linter": {
28-
"enabled": true
28+
"enabled": true,
29+
"rules": {
30+
"performance": {
31+
"noAccumulatingSpread": "off"
32+
}
33+
}
2934
},
3035
"vcs": {
3136
"useIgnoreFile": true,

src/ExpoSecureEnvironmentModule.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { requireNativeModule } from 'expo-modules-core'
2+
import type { SecureEnvironment } from './SecureEnvironment'
3+
4+
type UnwrapPromiseReturnTypes<T, ExcludedKey extends keyof T = never> = {
5+
[K in keyof T]: K extends ExcludedKey
6+
? T[K]
7+
: T[K] extends (...args: infer A) => Promise<infer R> | infer S
8+
? (...args: A) => Promise<R> extends Promise<infer U> ? U : Promise<R> | S
9+
: T[K]
10+
}
11+
12+
const nativeExpoSecureEnvironment = requireNativeModule<
13+
UnwrapPromiseReturnTypes<Omit<SecureEnvironment, 'batchGenerateKeyPair'>, 'sign'> & {
14+
supportsSecureEnvironment: () => boolean
15+
}
16+
>('ExpoSecureEnvironment')
17+
18+
export const expoSecureEnvironment = {
19+
generateKeypair: (keyId: string, biometricsBacked?: boolean): Uint8Array => {
20+
nativeExpoSecureEnvironment.generateKeypair(keyId, biometricsBacked)
21+
const publicKey = expoSecureEnvironment.getPublicBytesForKeyId(keyId)
22+
return publicKey
23+
},
24+
25+
batchGenerateKeyPair: (keyIds: Array<string>): Record<string, Uint8Array> => {
26+
for (const keyId of keyIds) {
27+
expoSecureEnvironment.generateKeypair(keyId)
28+
}
29+
30+
return keyIds
31+
.map((keyId) => ({
32+
keyId,
33+
publicKey: expoSecureEnvironment.getPublicBytesForKeyId(keyId),
34+
}))
35+
.reduce((prev, curr) => ({ ...prev, [curr.keyId]: curr.publicKey }), {})
36+
},
37+
38+
getPublicBytesForKeyId: (keyId: string): Uint8Array => {
39+
return nativeExpoSecureEnvironment.getPublicBytesForKeyId(keyId)
40+
},
41+
42+
sign: (keyId: string, message: Uint8Array, biometricsBacked?: boolean): Promise<Uint8Array> => {
43+
return nativeExpoSecureEnvironment.sign(keyId, message, biometricsBacked)
44+
},
45+
46+
supportsSecureEnvironment: () => {
47+
return nativeExpoSecureEnvironment.supportsSecureEnvironment()
48+
},
49+
}

src/SecureEnvironment.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,22 @@
55
*
66
*/
77

8-
import { Platform, requireNativeModule } from 'expo-modules-core'
9-
10-
const expoSecureEnvironment = requireNativeModule<SecureEnvironment & { supportsSecureEnvironment: () => boolean }>(
11-
'ExpoSecureEnvironment'
12-
)
8+
import { Platform } from 'expo-modules-core'
9+
import { expoSecureEnvironment } from './ExpoSecureEnvironmentModule'
1310

1411
export interface SecureEnvironment {
15-
generateKeypair(id: string, biometricsBacked?: boolean): Promise<void> | void
12+
generateKeypair(keyId: string, biometricsBacked?: boolean): Promise<Uint8Array> | Uint8Array
13+
/**
14+
*
15+
* @todo Might be better to make this optional
16+
*
17+
* Returns an object where each key is the `keyId` and the value is the public key bytes
18+
*
19+
*/
20+
batchGenerateKeyPair(
21+
keyIds: Array<string>,
22+
biometricsBacked?: boolean
23+
): Promise<Record<string, Uint8Array>> | Record<string, Uint8Array>
1624
getPublicBytesForKeyId(keyId: string): Promise<Uint8Array> | Uint8Array
1725
sign(keyId: string, message: Uint8Array, biometricsBacked?: boolean): Promise<Uint8Array>
1826
}

0 commit comments

Comments
 (0)