expo-aes-vetkeys
Version:
Hooks and components for using AES & vetkeys in Expo Web/Native applications
209 lines (146 loc) • 5.35 kB
Markdown
# expo-aes-vetkeys
An Expo library for managing AES encryption keys with vetkeys integration.
## Features
- AES key generation and management with Identity-Based Encryption (IBE)
- Secure storage integration using `expo-storage-universal`
- Crypto operations using `expo-crypto-universal`
- Vetkeys integration for asymmetric encryption
- React hook for easy AES key management
- Loading component for encryption processing state
- Performance monitoring for cryptographic operations
- Comprehensive TypeScript types and JSDoc documentation
## Installation
```bash
npm install expo-aes-vetkeys
```
### Required Peer Dependencies
This package requires the following peer dependencies:
```bash
# For storage functionality
npx expo install @react-native-async-storage/async-storage
npx expo install expo-secure-store
# For crypto functionality
npx expo install expo-crypto
```
## Usage
### Hook Usage
```typescript
import { useAesKey } from 'expo-aes-vetkeys';
// Define your backend implementation
const backend = {
asymmetricKeys: async (transportPublicKey: Uint8Array) => {
// Implement your backend logic
return {
publicKey: new Uint8Array(),
encryptedAesKey: undefined,
encryptedKey: undefined,
};
},
asymmetricSaveEncryptedAesKey: async (encryptedAesKey: Uint8Array) => {
// Implement your backend logic
},
};
// Use the hook in your component
const YourComponent = () => {
const { isProcessingAes, aesError } = useAesKey({
cryptoModule: yourCryptoModule, // Required: expo-crypto-universal CryptoModule
aesRawKeyStorage: yourStorage, // Required: Uint8ArrayValueStorageWrapper
identity: yourIdentity, // Optional: @dfinity/agent Identity
backend, // Required: AesBackend implementation
});
if (isProcessingAes) {
return <AesProcessingView />;
}
if (aesError) {
return <Text>Error: {aesError.message}</Text>;
}
return <Text>Ready!</Text>;
};
```
### Loading Component
The `AesProcessingView` component provides a user-friendly loading state during AES key processing operations. It's designed to be used with the `useAesKey` hook to display the processing state.
```typescript
import { AesProcessingView } from 'expo-aes-vetkeys';
// Basic usage
const YourComponent = () => {
return <AesProcessingView />;
};
// With useAesKey hook
const YourComponent = () => {
const { isProcessingAes } = useAesKey({
// ... hook configuration
});
if (isProcessingAes) {
return <AesProcessingView />;
}
return <Text>Ready!</Text>;
};
```
The component displays:
- A centered loading spinner in iOS-style blue (#007AFF)
- "Preparing Encryption..." status message
- "This may take a moment..." hint text
- Clean white background with proper padding
- Responsive layout that works on both mobile and web
## API
### useAesKey
A React hook for managing AES key initialization and encryption.
#### Props
- `cryptoModule`: Required `expo-crypto-universal` CryptoModule instance for cryptographic operations
- `aesRawKeyStorage`: Required `Uint8ArrayValueStorageWrapper` instance for key persistence
- `identity`: Optional `@dfinity/agent` Identity instance for authenticated operations
- `backend`: Required object implementing the `AesBackend` interface
#### Returns
- `isProcessingAes`: Boolean indicating if AES key processing is in progress
- `aesError`: Any error that occurred during processing
### AesProcessingView
A React Native component that displays a loading state during AES key processing.
#### Features
- Centered loading indicator with iOS-style blue color (#007AFF)
- Informative status message "Preparing Encryption..."
- Hint text "This may take a moment..."
- Responsive layout with max-width container (400px)
- Clean white background with proper padding
- Vertically centered content with -80px top margin for visual balance
### AesRawKeyStorage
A specialized storage wrapper for AES raw keys.
#### Features
- Extends `Uint8ArrayValueStorageWrapper` for type-safe storage
- Uses 'aesRawKey' as the default storage key
- Provides specific functionality for AES key storage
### Utility Functions
#### asymmetricKeys
- Generates asymmetric keys using the provided backend
- Measures and logs performance of key generation
- Returns `AsymmetricKeysResult` with public key and encrypted keys
#### decryptAesKey
- Decrypts AES keys using Identity-Based Encryption (IBE)
- Measures and logs performance of decryption
- Requires principal, encrypted key, public key, and transport secret key
#### encryptAesKey
- Encrypts AES keys using Identity-Based Encryption (IBE)
- Measures and logs performance of encryption
- Requires raw AES key, principal, public key, and seed
#### prepareAesKey
- Prepares AES key for encryption/decryption
- Creates transport secret key from seed
- Retrieves asymmetric keys from backend
#### saveEncryptedAesKeyToBackend
- Saves encrypted AES key to backend
- Measures and logs performance of save operation
## Dependencies
### Main Dependencies
- `@dfinity/agent`: ^0.20.0
- `expo-crypto-universal`: ^0.1.0
- `expo-storage-universal`: ^0.1.0
- `vetkeys-client-utils`: ^0.1.1
- `react`: ^18.3.1
- `react-native`: ^0.76.7
### Peer Dependencies
#### Storage
- `@react-native-async-storage/async-storage`
- `expo-secure-store`
#### Crypto
- `expo-crypto`
## License
MIT