この関数の戻り値の型を変更するにはどうすればよいですか?

エリック

AES実装用のrust-cryptoを使用して、rustを使用したmatasano暗号化の課題経験しています。私は基本的なECBモード暗号化を行うためにこの関数を持っています(基本的にはrust-cryptoリポジトリの例からほぼ逐語的に取られています):

pub fn aes_enc_ecb_128(key: &[u8], data: &[u8]) 
                       -> Result<Vec<u8>, symmetriccipher::SymmetricCipherError> {
    let mut encryptor = aes::ecb_encryptor(
            aes::KeySize::KeySize128,
            key,
            blockmodes::NoPadding);
    let mut final_result = Vec::<u8>::new();
    let mut read_buffer = buffer::RefReadBuffer::new(data);
    let mut buffer = [0; 4096];
    let mut write_buffer = buffer::RefWriteBuffer::new(&mut buffer);

    loop {
        let result = encryptor.encrypt(&mut read_buffer,
                                       &mut write_buffer,
                                       true);

        final_result.extend(write_buffer
                            .take_read_buffer()
                            .take_remaining().iter().map(|&i| i));
        match result {
            Ok(BufferResult::BufferUnderflow) => break,
            Ok(_) => {},
            Err(e) => return Err(e)
        }
    }

    Ok(final_result)
}

上記のバージョンは問題なくコンパイルされ、期待どおりに動作します。ただし、他のエラー処理スキームに合わせるために、戻り値の型をに変更したいと思いResult<Vec<u8>,&'static str>ます。これは、その変更が適用された関数です。

pub fn aes_enc_ecb_128(key: &[u8], data: &[u8]) 
                       -> Result<Vec<u8>, &'static str> {
    let mut encryptor = aes::ecb_encryptor(
            aes::KeySize::KeySize128,
            key,
            blockmodes::NoPadding);
    let mut final_result = Vec::<u8>::new();
    let mut read_buffer = buffer::RefReadBuffer::new(data);
    let mut buffer = [0; 4096];
    let mut write_buffer = buffer::RefWriteBuffer::new(&mut buffer);

    loop {
        let result = encryptor.encrypt(&mut read_buffer,
                                       &mut write_buffer,
                                       true);

        final_result.extend(write_buffer
                            .take_read_buffer()
                            .take_remaining().iter().map(|&i| i));
        match result {
            Ok(BufferResult::BufferUnderflow) => break,
            Ok(_) => {},
            Err(_) => return Err("Encryption failed")
        }
    }

    Ok(final_result)
}

このバージョンをコンパイルしようとすると、次のエラーが発生します(わかりやすくするためにパスが削除されています)。

error: source trait is private
         let result = encryptor.encrypt(&mut read_buffer,
                                        &mut write_buffer,
                                        true);
error: source trait is private
let r = decryptor.decrypt(&mut read_buffer, &mut write_buffer, true);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

このタイプを変更できる唯一の方法は、元の関数を次のような変換関数でラップすることです。

pub fn converted_enc(key: &[u8], data: &[u8]) 
                       -> Result<Vec<u8>, &'static str> {
   match aes_enc_ecb_128(key,data) {
       Ok(v) => Ok(v),
       Err(_) => Err("Encryption failed")
   } 
}

戻り値をAPIの残りの部分に合わせるために、上記の代わりに何をすべきですか?また、より直接的なメソッドが失敗するのはなぜですか?

私は次のバージョンの錆/貨物を使用しています:

rustc 1.2.0-nightly (0cc99f9cc 2015-05-17) (built 2015-05-18)
cargo 0.2.0-nightly (ac61996 2015-05-17) (built 2015-05-17)
aochagavia

コンパイラのバグに遭遇したと思います。コードをコンパイルする必要があります

use crypto::symmetriccipher::Encryptor;回避策として次のことができます

pub fn aes_enc_ecb_128(key: &[u8], data: &[u8]) 
                       -> Result<Vec<u8>, &'static str> {
    use crypto::symmetriccipher::Encryptor;
    let mut encryptor = aes::ecb_encryptor(
            aes::KeySize::KeySize128,
            key,
            blockmodes::NoPadding);
    let mut final_result = Vec::<u8>::new();
    let mut read_buffer = buffer::RefReadBuffer::new(data);
    let mut buffer = [0; 4096];
    let mut write_buffer = buffer::RefWriteBuffer::new(&mut buffer);

    loop {
        let result = encryptor.encrypt(&mut read_buffer,
                                       &mut write_buffer,
                                       true);

        final_result.extend(write_buffer
                            .take_read_buffer()
                            .take_remaining().iter().map(|&i| i));
        match result {
            Ok(BufferResult::BufferUnderflow) => break,
            Ok(_) => {},
            Err(_) => return Err("Encryption failed")
        }
    }

    Ok(final_result)
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

関数の戻り値をintに変更するにはどうすればよいですか?

分類Dev

型変数なしで戻り値の型を推測するにはどうすればよいですか?

分類Dev

typescriptで非同期関数の戻り値の型を取得するにはどうすればよいですか?

分類Dev

Typescriptでlodashreduce関数の戻り値の型を定義するにはどうすればよいですか?

分類Dev

非同期Python関数で戻り値の型を指定するにはどうすればよいですか?

分類Dev

beforesend()関数の戻り値に応じてajax関数のURLを変更するにはどうすればよいですか?

分類Dev

beforesend()関数の戻り値に応じてajax関数のURLを変更するにはどうすればよいですか?

分類Dev

この関数から一貫した戻り値の型を取得するにはどうすればよいですか?

分類Dev

Typescriptで複数の関数の戻り型を管理するにはどうすればよいですか?

分類Dev

Typescript:引数の型に基づいて関数の戻り値の型を取得するにはどうすればよいですか?

分類Dev

戻り値の型が引数の入力型に依存する関数をタイプヒントするにはどうすればよいですか?

分類Dev

「自動」戻り値の型関数の値で返すにはどうすればよいですか

分類Dev

引数の型に基づいて戻り値を取得するにはどうすればよいですか?

分類Dev

非同期関数の成功の戻り値の型である型を宣言するにはどうすればよいですか?

分類Dev

引数付きの関数の戻り値を取得するにはどうすればよいですか?

分類Dev

cの関数の戻り値のみを取得するにはどうすればよいですか?

分類Dev

渡された引数に依存する関数の戻り値の型をtypescriptに知らせるにはどうすればよいですか?

分類Dev

各テストでjest mock関数の戻り値を変更するにはどうすればよいですか?

分類Dev

各テストでjest mock関数の戻り値を変更するにはどうすればよいですか?

分類Dev

プロパティ関数の戻り値の型をプロパティの型として推測するにはどうすればよいですか?

分類Dev

C ++で列挙型を使用して関数の戻り値の型を特殊化するにはどうすればよいですか?

分類Dev

UDF関数の戻り値を2つの列に保存するにはどうすればよいですか?

分類Dev

Javascriptの別の関数で戻り値を使用するにはどうすればよいですか?

分類Dev

javascriptの関数で変数の値を変更するにはどうすればよいですか?

分類Dev

関数に返された関数の戻り値の型を継承させるにはどうすればよいですか?

分類Dev

C ++:関数の戻り値の精度を設定するにはどうすればよいですか?

分類Dev

関数の戻り値へのポインタを取得するにはどうすればよいですか?

分類Dev

引数と戻り値の型に一致するconst修飾子を使用して関数を作成するにはどうすればよいですか?

分類Dev

テンプレートで使用する関数の戻り値の型を取得するにはどうすればよいですか?

Related 関連記事

  1. 1

    関数の戻り値をintに変更するにはどうすればよいですか?

  2. 2

    型変数なしで戻り値の型を推測するにはどうすればよいですか?

  3. 3

    typescriptで非同期関数の戻り値の型を取得するにはどうすればよいですか?

  4. 4

    Typescriptでlodashreduce関数の戻り値の型を定義するにはどうすればよいですか?

  5. 5

    非同期Python関数で戻り値の型を指定するにはどうすればよいですか?

  6. 6

    beforesend()関数の戻り値に応じてajax関数のURLを変更するにはどうすればよいですか?

  7. 7

    beforesend()関数の戻り値に応じてajax関数のURLを変更するにはどうすればよいですか?

  8. 8

    この関数から一貫した戻り値の型を取得するにはどうすればよいですか?

  9. 9

    Typescriptで複数の関数の戻り型を管理するにはどうすればよいですか?

  10. 10

    Typescript:引数の型に基づいて関数の戻り値の型を取得するにはどうすればよいですか?

  11. 11

    戻り値の型が引数の入力型に依存する関数をタイプヒントするにはどうすればよいですか?

  12. 12

    「自動」戻り値の型関数の値で返すにはどうすればよいですか

  13. 13

    引数の型に基づいて戻り値を取得するにはどうすればよいですか?

  14. 14

    非同期関数の成功の戻り値の型である型を宣言するにはどうすればよいですか?

  15. 15

    引数付きの関数の戻り値を取得するにはどうすればよいですか?

  16. 16

    cの関数の戻り値のみを取得するにはどうすればよいですか?

  17. 17

    渡された引数に依存する関数の戻り値の型をtypescriptに知らせるにはどうすればよいですか?

  18. 18

    各テストでjest mock関数の戻り値を変更するにはどうすればよいですか?

  19. 19

    各テストでjest mock関数の戻り値を変更するにはどうすればよいですか?

  20. 20

    プロパティ関数の戻り値の型をプロパティの型として推測するにはどうすればよいですか?

  21. 21

    C ++で列挙型を使用して関数の戻り値の型を特殊化するにはどうすればよいですか?

  22. 22

    UDF関数の戻り値を2つの列に保存するにはどうすればよいですか?

  23. 23

    Javascriptの別の関数で戻り値を使用するにはどうすればよいですか?

  24. 24

    javascriptの関数で変数の値を変更するにはどうすればよいですか?

  25. 25

    関数に返された関数の戻り値の型を継承させるにはどうすればよいですか?

  26. 26

    C ++:関数の戻り値の精度を設定するにはどうすればよいですか?

  27. 27

    関数の戻り値へのポインタを取得するにはどうすればよいですか?

  28. 28

    引数と戻り値の型に一致するconst修飾子を使用して関数を作成するにはどうすればよいですか?

  29. 29

    テンプレートで使用する関数の戻り値の型を取得するにはどうすればよいですか?

ホットタグ

アーカイブ