44534


C++ 初心者です。  
現在 SSL を利用したプロクラムを制作しています。  
その中で、以下のようなコードを書くことになりました。

[code]

        int buf_size = 256;
        char buf[buf_size];
        int read_size;
        stringstream original_string;
    
        do {
            read_size = SSL_read(ssl, buf, buf_size);
            original_string << buf;
            memset(buf, 0, buf_size);
        } while(read_size > 0);
    
[/code]

`memset(buf, 0, buf_size);` が無駄だと思っているのですが、`char[]` の指定した箇所のみ `stringstream`
に追加することは可能でしょうか？ （せっかく `read_size` で取得できているので……）  
また、このような場面で `stringstream` を利用するのは正しいでしょうか？


CC BY-SA 4.0
2018-06-05T09:14:30.000
44533
2019-08-23T04:12:30.880
28786
question
c++
C++ でのバッファの扱い


[`stringstream::write()`](https://cpprefjp.github.io/reference/ostream/basic_ostream/write.html)を使えば範囲を指定して追加できます。

[code]

    do {
        read_size = SSL_read(ssl, buf, buf_size);
        original_string.write(buf, buf_size);
    } while(read_size > 0);
    
[/code]

単純に結合するだけなら`std::string`でも十分に思います。この場合[`string::append()`](https://cpprefjp.github.io/reference/string/basic_string/append.html)です。

[code]

    std::string original_string;
    do {
        read_size = SSL_read(ssl, buf, buf_size);
        original_string.append(buf, buf_size);
    } while(read_size > 0);
    
[/code]


CC BY-SA 4.0
2018-06-05T09:29:45.163
44534
2018-06-05T09:29:45.163
4236
44533
answer


もしかしたらセキュリティ的意図があるのかもしれません。 `SSL_read`
で読み込んだ値がセキュリティ的に重大な値（パスワードの類）であって、攻撃者が定期的にメモリダンプを取ることで当該データを読み取ることが（不可能には決してならないわけですが）困難になるようにメモリクリアを行っているのかもしれません。

`memset` の後で `buf` を使用していないので、コンパイラは `memset`
の（インライン）呼出しを生成しなくてよいことになっているため、セキュリティ対策として役に立たないことがあるから要注意ってのは JPCERT
でも指摘があります。  
<https://www.jpcert.or.jp/sc-rules/c-msc06-c.html>  
`memset_s` なり `SecureZeroMemory` なり `explicit_bzero`
なりはこの最適化を禁止し、セキュリティ的用途に使えることが保証されているようです。


CC BY-SA 4.0
2019-08-23T03:33:48.320
57559
2019-08-23T04:12:30.880
2019-08-23T04:12:30.880
8589
8589
44533
answer