Home Reference Source Test

src/security/engines/MemoryCryptoEngine.js

import KeyStoreCryptoEngine from './KeyStoreCryptoEngine';
import MemoryKeyStore from './MemoryKeyStore';

/**
 * MemoryCryptoEngine: Implements the CryptoEngine interface.
 *
 * Crypto engine to handle signatures, verifications, and key storage, in memory. Handles storage
 * for multiple members at once, and uses the following schema:
 *
 * {
 *   'ACTIVE': 'm:12345:678', // member ID of most-recently active member
 *   'm:12345:678': { // a member's keys:
 *     'PRIVILEGED': {
 *          id: '456', // key ID
 *          algorithm: ED25519,
 *          level: PRIVILEGED,
 *          publicKey: Buffer(...), // public key data
 *          privateKey: Buffer(...), // secret key data
 *      },
 *     'LOW': {...},
 *     'STANDARD': {...},
 *   },
 *   'm:91011:12d': {...} // other member's keys...
 * }
 *
 */

const globalKeyStore = new MemoryKeyStore();

class MemoryCryptoEngine extends KeyStoreCryptoEngine {
    constructor(memberId) {
        super(memberId, globalKeyStore);
    }

    /**
     * Gets the currently active memberId.
     * This allows login without caching memberId somewhere
     *
     * @return {string} active memberId
     */
    static getActiveMemberId() {
        const memberId = MemoryKeyStore.getActiveMemberId();
        if (!memberId) {
            throw new Error('No active memberId on this browser');
        }
        return memberId;
    }
}

export default MemoryCryptoEngine;