Logo Search packages:      
Sourcecode: g2ipmsg version File versions  Download package

int symcrypt_encrypt_message ( ipmsg_cap_t  type,
const unsigned char *  plain,
char **  key_p,
size_t *  key_len_p,
char **  enc_p,
size_t *  enc_len_p 
)

共通鍵暗号による暗号化を行う

Parameters:
[in] type 暗号種別を表す暗号ケイパビリティ
[in] plain 平文
[out] key_p 暗号化に使用した鍵を指すポインタのアドレス
[out] key_len_p 暗号化に使用した鍵の鍵長返却領域
[out] enc_p 暗号化された電文を指すポインタのアドレス
[out] enc_len_p 暗号化された電文の電文長返却領域
Return values:
0 正常終了
-EINVAL 引数異常
-ENOMEM メモリ不足

Definition at line 642 of file symcrypt.c.

References aes_cbc_encrypt_setup(), blowfish_cbc_encrypt_setup(), common_cbc_encrypt(), common_cbc_finalize(), rc2_cbc_encrypt_setup(), and symcrypt_get_skey_length().

Referenced by ipmsg_encrypt_message().

                                     {
      size_t      key_len = 0;
      size_t      enc_len = 0;
      size_t    plain_len = 0;
      EVP_CIPHER_CTX *ctx = NULL;
      char           *key = NULL;
      char           *enc = NULL;
      int              rc = 0;
      char             iv[EVP_MAX_IV_LENGTH];

      if ( (plain == NULL) || (key_p == NULL) || (key_len_p == NULL) || 
          (enc_p == NULL) || (enc_len_p == NULL) ) {
            rc = -EINVAL;
            goto error_out;
      }

      /*
       * 平文のバッファ長を獲得(ヌルターミネートを含む)
       */
      plain_len = strlen(plain) + 1;

      /*
       * 暗号ケイパビリティから鍵長を算出
       */
      rc = symcrypt_get_skey_length(type, &key_len);
      if (rc != 0)
            goto error_out;

      /*
       * 鍵格納バッファを獲得
       */
      key = g_malloc(key_len);
      if (key == NULL) {
            rc = -ENOMEM;
            goto error_out;
      }

      /*
       * 暗号化鍵を生成(ランダム値を使用)
       */
      rc = generate_rand(key, key_len);
      if (rc != 0) 
            goto key_free_out;

      /*
       * IPMSGで規定されたivを設定
       */
      memset(iv, 0, EVP_MAX_IV_LENGTH);

      /*
       * 暗号コンテキストの設定
       */
      switch(type){
      case IPMSG_RC2_40:
      case IPMSG_RC2_128:
      case IPMSG_RC2_256:
            dbg_out("Use RC2 key %d\n", key_len);
            rc = rc2_cbc_encrypt_setup(key, key_len, NULL, &ctx);
            break;
      case IPMSG_BLOWFISH_128:
      case IPMSG_BLOWFISH_256:
            dbg_out("Use BlowFish key %d\n", key_len);
            rc = blowfish_cbc_encrypt_setup(key, key_len, NULL, &ctx);
            break;
      case IPMSG_AES_128:
      case IPMSG_AES_192:
      case IPMSG_AES_256:
            dbg_out("Use AES key %d\n", key_len);
            rc = aes_cbc_encrypt_setup(key, key_len, NULL, &ctx);
            break;
      default:
            rc = -EINVAL; /* 不正な鍵種別 */
            break;
      }
      if (rc != 0) {
            err_out("Can not set key\n");
            goto key_free_out;
      }

      /*
       * 暗号化を実施
       */
      rc = common_cbc_encrypt(ctx, plain, plain_len, &enc, &enc_len);
      if (rc != 0) {
            err_out("Can not encrypt message\n");
            goto key_free_out;
      }
      
      /*
       * 暗号コンテキスト開放
       */
      rc = common_cbc_finalize(&ctx);
      if (rc != 0) {
            err_out("Can not clean up encrypt\n");
            goto enc_free_out;
      }

      /*
       * 返却
       */
      *key_p     = key;     /* 暗号鍵       */
      *key_len_p = key_len; /* 鍵長         */
      *enc_p     = enc;     /* 暗号化電文   */
      *enc_len_p = enc_len; /* 暗号化電文長 */

      return 0;

 enc_free_out:
      if (enc != NULL)
            g_free(enc);
 ctx_free_out:
      if (ctx != NULL)
            common_cbc_finalize(&ctx);
 key_free_out:
      if (key != NULL)
            g_free(key);
error_out:
      return rc;
}


Generated by  Doxygen 1.6.0   Back to index