2011-11-10 13 views
1

js RSAライブラリを使用するのではなく、RSAライブラリを使用するのではなく、RSAライブラリを使用してRSAを実行するためのネイティブopensslを使用する関数を作成しようとしています。ターゲットファイルからNodeJS exec with binary with process

  1. 読むバイナリデータである
  2. は、EXECのSTDINストリームにバッファを書き込みバイナリデータを含む緩衝液中で得られた、JSを使用して、ノードのプロセスで何らかの処理を行いコマンド
  3. RSAの暗号化/更なる処理のためにJS-プロセスのバッファに戻し、入力データを取得し、データを復号化し、STDOUTストリーム
  4. に書き込む

Nodeのchild process moduleにはexecコマンドがありますが、入力をプロセスにパイプしてプロセスにパイプする方法がわかりません。基本的に私は以下のような種類のコマンドを実行したいのですが、ファイルへの書き込み物事に依存することなく、一時ファイルを書き込むことによって

cat the_binary_file.data | openssl -encrypt -inkey key_file.pem -certin > the_output_stream 

が、私はこれを行うことができます(opensslのの正確な構文をチェックしませんでした)可能であれば、私はそれを避けたいと思います。子プロセスを起動すると、stdin/outにアクセスできますが、execのこの機能は見つかりませんでした。

私がここにドラフトした方法でこれを行うためのきれいな方法はありますか?これにはopensslを使用する別の方法がありますか? openssl libのいくつかのネイティブバインディングは、コマンドラインに頼らずにこれを行うことができますか?

答えて

4

あなたはspawnを言及しましたが、使用できないと思われるようです。おそらくここで私の無知を示​​すかもしれませんが、それはあなたが探しているものだけでなければならないようです:spawn経由でopensslを起動し、child.stdinに書き込み、child.stdoutから読んでください。非常に大まかにこの完全にテストされていないコードのようなもの:

var util = require('util'), 
    spawn = require('child_process').spawn; 

function sslencrypt(buffer_to_encrypt, callback) { 
    var ssl = spawn('openssl', ['-encrypt', '-inkey', ',key_file.pem', '-certin']), 
     result = new Buffer(SOME_APPROPRIATE_SIZE), 
     resultSize = 0; 

    ssl.stdout.on('data', function (data) { 
     // Save up the result (or perhaps just call the callback repeatedly 
     // with it as it comes, whatever) 
     if (data.length + resultSize > result.length) { 
      // Too much data, our SOME_APPROPRIATE_SIZE above wasn't big enough 
     } 
     else { 
      // Append to our buffer 
      resultSize += data.length; 
      data.copy(result); 
     } 
    }); 

    ssl.stderr.on('data', function (data) { 
     // Handle error output 
    }); 

    ssl.on('exit', function (code) { 
     // Done, trigger your callback (perhaps check `code` here) 
     callback(result, resultSize); 
    }); 

    // Write the buffer 
    ssl.stdin.write(buffer_to_encrypt); 
} 
1

あなたが好き、exec呼び出しを行う際に、バイナリへのエンコーディングを設定することができるはずです。..

exec("openssl output_something_in_binary", {encoding: 'binary'}, function(err, out, err) { 
    //do something with out - which is in the binary format 
}); 

あなたが出て書きたい場合バイナリで "out"の内容を入力してください。

fs.writeFile("out.bin", out, {encoding: 'binary'}); 

私はこれが助けてくれることを願っています!