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.
		
		
		
		
		
			
		
			
				
	
	
		
			65 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
import { getSodiumNode } from './sodiumNode';
 | 
						|
 | 
						|
export async function decryptAttachmentBufferNode(
 | 
						|
  encryptingKey: Uint8Array,
 | 
						|
  bufferIn: ArrayBuffer,
 | 
						|
  getSodiumOverride?: () => Promise<any>
 | 
						|
) {
 | 
						|
  const sodium = getSodiumOverride ? await getSodiumOverride() : await getSodiumNode();
 | 
						|
 | 
						|
  const header = new Uint8Array(
 | 
						|
    bufferIn.slice(0, sodium.crypto_secretstream_xchacha20poly1305_HEADERBYTES)
 | 
						|
  );
 | 
						|
 | 
						|
  const encryptedBuffer = new Uint8Array(
 | 
						|
    bufferIn.slice(sodium.crypto_secretstream_xchacha20poly1305_HEADERBYTES)
 | 
						|
  );
 | 
						|
  try {
 | 
						|
    /* Decrypt the stream: initializes the state, using the key and a header */
 | 
						|
    const state = sodium.crypto_secretstream_xchacha20poly1305_init_pull(header, encryptingKey);
 | 
						|
    // what if ^ this call fail (? try to load as a unencrypted attachment?)
 | 
						|
 | 
						|
    const messageTag = sodium.crypto_secretstream_xchacha20poly1305_pull(state, encryptedBuffer);
 | 
						|
    // we expect the final tag to be there. If not, we might have an issue with this file
 | 
						|
    // maybe not encrypted locally?
 | 
						|
    if (messageTag.tag === sodium.crypto_secretstream_xchacha20poly1305_TAG_FINAL) {
 | 
						|
      return messageTag.message;
 | 
						|
    }
 | 
						|
  } catch (e) {
 | 
						|
    console.error('Failed to load the file as an encrypted one', e);
 | 
						|
  }
 | 
						|
  return new Uint8Array();
 | 
						|
}
 | 
						|
 | 
						|
export async function encryptAttachmentBufferNode(
 | 
						|
  encryptingKey: Uint8Array,
 | 
						|
  bufferIn: ArrayBuffer,
 | 
						|
  getSodiumOverride?: () => Promise<any>
 | 
						|
) {
 | 
						|
  const sodium = getSodiumOverride ? await getSodiumOverride() : await getSodiumNode();
 | 
						|
 | 
						|
  try {
 | 
						|
    const uintArrayIn = new Uint8Array(bufferIn);
 | 
						|
 | 
						|
    /* Set up a new stream: initialize the state and create the header */
 | 
						|
    const { state, header } = sodium.crypto_secretstream_xchacha20poly1305_init_push(encryptingKey);
 | 
						|
    /* Now, encrypt the buffer. */
 | 
						|
    const bufferOut = sodium.crypto_secretstream_xchacha20poly1305_push(
 | 
						|
      state,
 | 
						|
      uintArrayIn,
 | 
						|
      null,
 | 
						|
      sodium.crypto_secretstream_xchacha20poly1305_TAG_FINAL
 | 
						|
    );
 | 
						|
 | 
						|
    const encryptedBufferWithHeader = new Uint8Array(bufferOut.length + header.length);
 | 
						|
    encryptedBufferWithHeader.set(header);
 | 
						|
    encryptedBufferWithHeader.set(bufferOut, header.length);
 | 
						|
 | 
						|
    return { encryptedBufferWithHeader, header };
 | 
						|
  } catch (e) {
 | 
						|
    console.error('encryptAttachmentBuffer error: ', e);
 | 
						|
 | 
						|
    return null;
 | 
						|
  }
 | 
						|
}
 |