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

int pcrypt_encrypt_message ( const ipmsg_cap_t  peer_cap,
const char *  peer_e,
const char *  peer_n,
const char *  plain,
size_t  plain_length,
char **  ret_buff,
ipmsg_cap_t akey_type 
)

ピアの公開鍵で電文暗号化に使用する共通鍵を暗号化する

Parameters:
[in] peer_cap ピアの公開鍵暗号化能力ID
[in] peer_e ピアの暗号化指数(hex形式)
[in] peer_n ピアの公開モジューロ(hex形式)
[in] plain 平文(電文暗号化に使用する共通鍵)
[in] plain_length 平文の長さ(バイト長)
[out] ret_buff 暗号化電文(hex形式)の返却領域
[out] akey_type 公開鍵暗号鍵種別を表す暗号化ケイパビリティ
Return values:
0 正常終了
-EINVAL 引数異常 (不正なIDをcapに指定した).
-ENOMEM メモリ不足

Definition at line 1360 of file pubcrypt.c.

References convert_peer_key(), G2IPMSG_CRYPT_EBUFSIZ, and select_asymmetric_key().

Referenced by ipmsg_encrypt_message().

                                                           {
      int                 rc = 0;
      RSA            *pubkey = NULL;
      BIGNUM *bn_encoded_key = NULL;
      size_t         enc_len = 0;
      size_t       crypt_len = 0;
      char    *encrypted_key = NULL;
      char      *encoded_key = NULL;
      ipmsg_cap_t   key_type = 0;
      char            errbuf[G2IPMSG_CRYPT_EBUFSIZ];

      if ( (peer_e == NULL) || (peer_n == NULL) || 
          (plain == NULL) || (ret_buff == NULL) )
            return -EINVAL;

      /*
       * hex形式のピアの鍵からRSA鍵情報を生成する
       */
      rc = convert_peer_key(peer_e, peer_n, &pubkey);
      if (rc != 0)
            return rc;

      /*
       * 電文の暗号化に使用する鍵をピアの公開鍵で暗号化する.
       */
      rc = -ENOMEM;
      enc_len = RSA_size(pubkey);  /*  暗号化電文長を取得する  */
      dbg_out("Public key:e=%s n=%s len=%d\n",  peer_e,  peer_n,  enc_len);

      encrypted_key = g_malloc(enc_len);  /*  暗号化した共通鍵格納領域を確保  */
      if (encrypted_key == NULL)
            goto free_pubkey_out;
      
      rc = RSA_public_encrypt(plain_length, plain, encrypted_key, pubkey, 
          RSA_PKCS1_PADDING); /* PKCS1パディングによる暗号化を実施  */

      if (rc <= 0) {
            rc = ERR_get_error();
            err_out("Can not encrypt key with public key: err=%s\n", 
                ERR_error_string(rc, errbuf));
            rc = -rc;
            goto free_encrypted_key_out;
      }

      /*
       * 使用した鍵情報を取得
       */
      rc = select_asymmetric_key(peer_cap, pubkey, &key_type);
      if (rc != 0)
            goto free_encrypted_key_out;

      /*
       * 暗号化した共通鍵をhex形式に変換
       */
      rc = -ENOMEM;
      bn_encoded_key = BN_bin2bn(encrypted_key, enc_len, NULL); /* エンディアン変換 */
      if (bn_encoded_key == NULL)
            goto free_encrypted_key_out;

      encoded_key = BN_bn2hex(bn_encoded_key); /* hex形式に変換 */
      if (encoded_key == NULL)
            goto free_bn_encoded_key_out;

      /*
       * 暗号化した共通鍵と使用した鍵種別を返却
       */
      *ret_buff = encoded_key;
      *akey_type = key_type;

      rc = 0;

free_bn_encoded_key_out:
      if (bn_encoded_key != NULL)
            BN_free(bn_encoded_key);

 free_encrypted_key_out:
      if (encrypted_key != NULL)
            g_free(encrypted_key);

 free_pubkey_out:
      if (pubkey != NULL) {
            BN_free(pubkey->n);
            BN_free(pubkey->e);
            pubkey->n = NULL;
            pubkey->e = NULL;    
            RSA_free(pubkey);
      }

      return rc;
}


Generated by  Doxygen 1.6.0   Back to index