/* * @Author: zcxb chen13157379235@outlook.com * @Date: 2022-09-21 11:59:12 * @LastEditors: zcxb chen13157379235@outlook.com * @LastEditTime: 2022-10-13 00:01:08 * @FilePath: \easy-front-core-sdk\packages\jos\src\security\common\CacheKeyStore.ts * @Description: * * Copyright (c) 2022 by zcxb chen13157379235@outlook.com, All Rights Reserved. */ import { Cryptogram } from '@easy-front-core-sdk/kits' import { Mkey } from '../Mkey' import { Constants } from './Constants' export class CacheKeyStore { private threshold_value = 3 private enc_key_store: Map = new Map() private dec_key_store: Map = new Map() private future_key_ids: Set = new Set() search_dec_key(mk_index: Buffer): Mkey { const res = this.dec_key_store.get(mk_index.toString('base64')) return res } num_of_keys(k_store_type) { if (k_store_type === Constants.KStoreType.ENC_STORE) return this.enc_key_store.size else return this.dec_key_store.size } get_enc_key_by_version(key_ver: number): Mkey { for (const key of this.enc_key_store.keys()) { const m_key: Mkey = this.enc_key_store.get(key) if (key_ver === m_key.ver) return m_key } return null } update_key(base64_index: string, m_key: Mkey, k_store_type) { if (Constants.KStoreType.ENC_STORE === k_store_type) { if (!this.enc_key_store.has(base64_index)) { this.enc_key_store.set(base64_index, m_key) } else { if (this.enc_key_store.get(base64_index).key_status !== m_key.key_status) { this.enc_key_store.set(base64_index, m_key) } } } else { if (!this.dec_key_store.has(base64_index)) { this.dec_key_store.set(base64_index, m_key) } else { if (this.dec_key_store.get(base64_index).key_status !== m_key.key_status) { this.dec_key_store.set(base64_index, m_key) } } } } remove_all_m_keys() { this.enc_key_store.clear() this.dec_key_store.clear() } remove_keys_via_list(target_list: string[], k_store_type) { const k_store = k_store_type === Constants.KStoreType.ENC_STORE ? this.enc_key_store : this.dec_key_store for (const target of target_list) { if (k_store.has(target)) { k_store.delete(target) } } } get_key_id_list(k_store_type): string[] { return k_store_type === Constants.KStoreType.ENC_STORE ? Array(...this.enc_key_store.keys()) : Array(...this.dec_key_store.keys()) } reset_future_key_ids() { this.future_key_ids.clear() } update_future_key_ids(service: string, max_ver: number) { const s_index = max_ver + 1 const range = Array(this.threshold_value) .fill(s_index) .map((el, i) => s_index + i) for (const i of range) { const future_key_id = Buffer.from(Cryptogram.md5(service + i), 'hex').toString('base64') this.future_key_ids.add(future_key_id) } } has_future_key_id(key_id) { return this.future_key_ids.has(Buffer.from(key_id).toString('base64')) } }