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();