You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			89 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			89 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			TypeScript
		
	
import { PubKey } from '../types';
 | 
						|
import { StringUtils } from '../utils';
 | 
						|
import * as Data from '../../../js/modules/data';
 | 
						|
 | 
						|
const toHex = (buffer: ArrayBuffer) => StringUtils.decode(buffer, 'hex');
 | 
						|
const fromHex = (hex: string) => StringUtils.encode(hex, 'hex');
 | 
						|
 | 
						|
export interface RatchetState {
 | 
						|
  chainKey: Uint8Array;
 | 
						|
  keyIdx: number;
 | 
						|
  pubKey: Uint8Array;
 | 
						|
}
 | 
						|
 | 
						|
// TODO: make this private when no longer needed by JS
 | 
						|
export async function saveSenderKeysInner(
 | 
						|
  groupId: string,
 | 
						|
  senderIdentity: PubKey,
 | 
						|
  chainKeyHex: string,
 | 
						|
  keyIdx: number,
 | 
						|
  messageKeys: any
 | 
						|
) {
 | 
						|
  const { log } = window;
 | 
						|
 | 
						|
  const ratchet = {
 | 
						|
    chainKeyHex,
 | 
						|
    messageKeys,
 | 
						|
    idx: keyIdx,
 | 
						|
  };
 | 
						|
 | 
						|
  log.debug(
 | 
						|
    'saving ratchet keys for group ',
 | 
						|
    groupId,
 | 
						|
    'sender',
 | 
						|
    senderIdentity.key
 | 
						|
  );
 | 
						|
 | 
						|
  await Data.createOrUpdateSenderKeys({
 | 
						|
    groupId,
 | 
						|
    senderIdentity: senderIdentity.key,
 | 
						|
    ratchet,
 | 
						|
  });
 | 
						|
 | 
						|
  log.debug(
 | 
						|
    `Saving sender keys for groupId ${groupId}, sender ${senderIdentity.key}`
 | 
						|
  );
 | 
						|
}
 | 
						|
 | 
						|
export async function createSenderKeyForGroup(
 | 
						|
  groupId: string,
 | 
						|
  senderIdentity: PubKey
 | 
						|
): Promise<RatchetState> {
 | 
						|
  // Generate Chain Key (32 random bytes)
 | 
						|
  const rootChainKey = await window.libsignal.crypto.getRandomBytes(32);
 | 
						|
  const rootChainKeyHex = toHex(rootChainKey);
 | 
						|
 | 
						|
  const keyIdx = 0;
 | 
						|
  const messageKeys = {};
 | 
						|
 | 
						|
  await saveSenderKeysInner(
 | 
						|
    groupId,
 | 
						|
    senderIdentity,
 | 
						|
    rootChainKeyHex,
 | 
						|
    keyIdx,
 | 
						|
    messageKeys
 | 
						|
  );
 | 
						|
 | 
						|
  const pubKey = new Uint8Array(fromHex(senderIdentity.key));
 | 
						|
  const chainKey = new Uint8Array(rootChainKey);
 | 
						|
 | 
						|
  return { pubKey, chainKey, keyIdx: 0 };
 | 
						|
}
 | 
						|
 | 
						|
// Save somebody else's key
 | 
						|
export async function saveSenderKeys(
 | 
						|
  groupId: string,
 | 
						|
  senderIdentity: PubKey,
 | 
						|
  chainKeyHex: string,
 | 
						|
  keyIdx: number
 | 
						|
) {
 | 
						|
  const messageKeys = {};
 | 
						|
  await saveSenderKeysInner(
 | 
						|
    groupId,
 | 
						|
    senderIdentity,
 | 
						|
    chainKeyHex,
 | 
						|
    keyIdx,
 | 
						|
    messageKeys
 | 
						|
  );
 | 
						|
}
 |