From 636b0323075225c584b62719ed51e75521bb7ffb Mon Sep 17 00:00:00 2001 From: aura Date: Tue, 17 Feb 2026 22:39:42 +0100 Subject: push source --- backend/chat-reader.cjs | 82 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 backend/chat-reader.cjs (limited to 'backend/chat-reader.cjs') diff --git a/backend/chat-reader.cjs b/backend/chat-reader.cjs new file mode 100644 index 0000000..e30e7c9 --- /dev/null +++ b/backend/chat-reader.cjs @@ -0,0 +1,82 @@ +const fs = require('fs'); +const crypto = require('crypto'); + +function jwt_secret() { + let file = fs.readFileSync( '../data/jwt_secret.txt', 'utf8' ); + if( file.endsWith( '\n' ) ) { + file = file.slice( 0, -1 ); + } + + return file; +} + +function write( content, filename ) { + const chatJson = content; + + const salt = crypto.randomBytes( 16 ); + const key = crypto.pbkdf2Sync( jwt_secret(), salt, 100000, 32, 'sha512' ); + const iv = crypto.randomBytes( 12 ); + + const cipher = crypto.createCipheriv( 'aes-256-gcm', key, iv ); + let encrypted = cipher.update( chatJson, 'utf8', 'hex' ); + encrypted += cipher.final( 'hex' ); + const authTag = cipher.getAuthTag().toString( 'hex' ); + + let fullStr = salt.toString( 'hex' ) + iv.toString( 'hex' ) + authTag + encrypted; + + fs.writeFileSync( filename, fullStr ); +} + +function read( filename ) { + let contents = ''; + try { + contents = fs.readFileSync( filename, 'utf8' ); + } catch( e ) { + console.log( '0' ); + return; + } + const salt = Buffer.from( contents.slice( 0, 32 ), 'hex' ); + const iv = Buffer.from( contents.slice( 32, 56 ), 'hex' ); + const authTag = Buffer.from( contents.slice( 56, 88 ), 'hex' ); + const data = contents.slice( 88 ); + + const key = crypto.pbkdf2Sync( jwt_secret(), salt, 100000, 32, 'sha512' ); + const decipher = crypto.createDecipheriv( 'aes-256-gcm', key, iv ); + decipher.setAuthTag( authTag ); + + let decrypted = decipher.update( data, 'hex', 'utf8' ); + decrypted += decipher.final( 'utf8' ); + + return decrypted; +} + +function main() { + const args = process.argv.slice(2); + const operation = args[0]; + + switch( operation ) { + case 'read': { + try { + const data = read( args[1] ); + console.log( JSON.parse( JSON.stringify( data ) ) ); + } catch( e ) { + console.log( "0" ); + console.log( e.message ); + } + break; + } + case 'write': { + try { + const data = args[2]; + write( data, args[1] ); + console.log( "1" ); + } catch( e ) { + console.log( "0" ); + console.log( e.message ); + } + break; + } + } +} + +main(); -- cgit v1.2.3