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

int pcrypt_sign ( const ipmsg_cap_t  cap,
const ipmsg_cap_t  sign_type,
const unsigned char *  msg_str,
unsigned char **  ret_buff 
)

自ホストの秘密鍵を使用して電文に署名を付す

Parameters:
[in] cap 通信に使用する書名種別を含む暗号化ケイパビリティ
[in] sign_type 使用する署名種別
  • IPMSG_SIGN_MD5 MD5署名を使用
  • IPMSG_SIGN_SHA1 SHA1を使用
[in] msg_str 署名対象となる暗号化鍵を含む暗号化電文 (IPMSG暗号化電文パケットの本文部)
[out] ret_buff msg_strに付した署名を指し示すためのポインタ変数の アドレスを指定
Return values:
0 正常終了
-EINVAL 引数異常 (msg_str, ret_buffのいずれかがNULL).
-ENOMEM メモリ不足

Definition at line 1588 of file pubcrypt.c.

References G2IPMSG_CRYPT_EBUFSIZ, and pcrypt_crypt_refer_rsa_key().

Referenced by ipmsg_encrypt_message().

                                                            {
      int                     rc = 0;
      size_t             out_len = 0;
      size_t             msg_len = 0;
      int          nid_sign_type = 0;
      size_t          digest_len = 0;
      RSA                   *key = NULL;
      unsigned char         *out = NULL;
      BIGNUM            *bn_hash = NULL;
      unsigned char *hash_string = NULL;
      void                  *ref = NULL;
      BIGNUM             *bn_ref = NULL;  
      char                errbuf[G2IPMSG_CRYPT_EBUFSIZ];
      unsigned char         hash[MD5SHA1_DIGEST_LEN];

      if ( (msg_str == NULL) || (ret_buff == NULL) )
            return -EINVAL;

      /*
       * 使用した暗号化ケイパビリティからRSA鍵情報を獲得する
       */
      rc = pcrypt_crypt_refer_rsa_key(cap, &key);
      if (rc != 0)
            return rc;

      msg_len = strlen(msg_str);  /*  署名対象電文長を獲得  */

      rc = -ENOMEM;
      out = g_malloc(RSA_size(key)); /*  署名のサイズを獲得  */
      if (out == NULL)
            goto no_free_out;

      /*
       *  署名のハッシュ値を獲得  
       */
      switch(sign_type) {
      case IPMSG_SIGN_MD5:
            nid_sign_type = NID_md5;
            digest_len = MD5_DIGEST_LEN;

            ref = MD5(msg_str, msg_len, hash);
            if (ref == NULL) {
                  rc = ERR_get_error();
                  err_out("Can not calculate MD5 hash value: err=%s\n", 
                      ERR_error_string(rc, errbuf));
                  rc = -rc;
                  goto out_free_out;
            }
            break;
      case IPMSG_SIGN_SHA1:
            nid_sign_type = NID_sha1;
            digest_len = SHA1_DIGEST_LEN;
            
            ref = SHA1(msg_str, msg_len, hash);
            if (ref == NULL) {
                  rc = ERR_get_error();
                  err_out("Can not calculate SHA1 hash value: err=%s\n", 
                      ERR_error_string(rc, errbuf));
                  rc = -rc;
                  goto out_free_out;
            }
            break;
      default:
            rc = -EINVAL;
            goto out_free_out;
            break;
      }

      /*
       * バイナリ形式の署名を生成
       */
      rc = RSA_sign(nid_sign_type, hash, digest_len, out, &out_len, key);
      if (rc < 0)
            goto out_free_out;

      /*
       * 署名をネットワークバイトオーダに変換
       */
      rc = -ENOMEM;
      bn_hash = BN_new();
      if (bn_hash == NULL)
            goto out_free_out;

      bn_ref = BN_bin2bn(out, out_len, bn_hash); /* bin2bnは, 複製を作らないことに注意 */
      if (bn_ref == NULL) {
            rc = ERR_get_error();
            err_out("Can not convert binary sign to BIGNUM: err=%s\n", 
                ERR_error_string(rc, errbuf));
            rc = -rc;
            goto bn_hash_free_out;
      }

      /*
       * 署名をhex形式に変換
       */
      hash_string = BN_bn2hex(bn_hash);
      if (hash_string == NULL) {
            rc = ERR_get_error();
            err_out("Can not convert BIGNUM sign to hex: err=%s\n", 
                ERR_error_string(rc, errbuf));
            rc = -rc;         
            goto bn_hash_free_out;
      }

      rc = 0;
      *ret_buff = hash_string;  /*  署名を返却  */

bn_hash_free_out:
      if (bn_hash != NULL)
            BN_free(bn_hash);  
out_free_out:
      if (out != NULL)
            g_free(out);

no_free_out:
      return rc;
}


Generated by  Doxygen 1.6.0   Back to index