インテル® インテグレーテッド・パフォーマンス・プリミティブ (インテル® IPP) Cryptography は、広範なセキュアで効率良い暗号化アルゴリズムの実装を提供するソフトウェア・ライブラリーです。

インテル® IPP Cryptography は、次のスイート製品の一部としてインストールされます。

また、コミュニティー・ライセンス・プログラム (英語) の下でスタンドアロン・パッケージとして利用することもできます。

インテル® IPP Cryptography は、輸出規制の対象製品であり、特別な申請プロセスにより取得する必要があります。詳細は、「インテル® IPP Cryptography ライブラリーはどこからダウンロードできますか?」 (英語) を参照してください。

準備

環境変数の設定

インテル® IPP Cryptography をインストール後、ターゲット・プラットフォーム・アーキテクチャーに応じて適切なスクリプトを実行して、IPPCRYPTOROOTLD_LIBRARY_PATH、および NLSPATH 環境変数を設定します。スクリプトは、<install_dir>/ippcp/bin にあります。

デフォルトでは、<install_dir> は次のとおりです。

  • root ユーザーの場合: /opt/intel/compilers_and_libraries_2019.x.xxx/linux
  • root 以外のユーザーの場合: $HOME/intel/compilers_and_libraries_2019.x.xxx/linux

システム要件

インテル® IPP Cryptography アプリケーションのビルドと実行

インテル® IPP Cryptography を初めて使用される方のために、以下に簡単なアプリケーションのサンプルコードを示します。

#include "ippcp.h"
#include <stdio.h>

#define   ippCPUID_MMX             0x00000001   /* インテル(R) MMX(R) テクノロジー                                                    */
#define   ippCPUID_SSE             0x00000002   /* インテル(R) ストリーミング SIMD 拡張命令 (インテル(R) SSE)                         */
#define   ippCPUID_SSE2            0x00000004   /* インテル(R) SSE2                                                                   */
#define   ippCPUID_SSE3            0x00000008   /* インテル(R) SSE3                                                                   */
#define   ippCPUID_SSSE3           0x00000010   /* インテル(R) SSSE3                                                                  */
#define   ippCPUID_MOVBE           0x00000020   /* プロセッサーによる MOVBE 命令のサポート                                            */
#define   ippCPUID_SSE41           0x00000040   /* インテル(R) SSE4.1                                                                 */
#define   ippCPUID_SSE42           0x00000080   /* インテル(R) SSE4.2                                                                 */
#define   ippCPUID_AVX             0x00000100   /* インテル(R) アドバンスト・ベクトル・エクステンション (インテル(R) AVX)             */
#define   ippAVX_ENABLEDBYOS       0x00000200   /* OS によるインテル(R) AVX サポート                                                  */
#define   ippCPUID_AES             0x00000400   /* インテル(R) AES New Instructions (インテル(R) AES-NI)                              */
#define   ippCPUID_CLMUL           0x00000800   /* PCLMULQDQ 命令                                                                     */
#define   ippCPUID_ABR             0x00001000   /* 予約済み                                                                           */
#define   ippCPUID_RDRAND          0x00002000   /* 乱数読み取り命令                                                                   */
#define   ippCPUID_F16C            0x00004000   /* Float16 命令                                                                       */
#define   ippCPUID_AVX2            0x00008000   /* インテル(R) AVX2                                                                   */
#define   ippCPUID_ADCOX           0x00010000   /* ADCX および ADOX 命令                                                              */
#define   ippCPUID_RDSEED          0x00020000   /* RDSEED 命令                                                                        */
#define   ippCPUID_PREFETCHW       0x00040000   /* PREFETCHW 命令                                                                     */
#define   ippCPUID_SHA             0x00080000   /* インテル(R) SHA 拡張                                                               */
#define   ippCPUID_AVX512F         0x00100000   /* インテル(R) AVX-512 基本命令                                                       */
#define   ippCPUID_AVX512CD        0x00200000   /* インテル(R) AVX-512 競合検出命令                                                   */
#define   ippCPUID_AVX512ER        0x00400000   /* インテル(R) AVX-512 指数および逆数命令                                             */
#define   ippCPUID_AVX512PF        0x00800000   /* インテル(R) AVX-512 プリフェッチ命令                                               */
#define   ippCPUID_AVX512BW        0x01000000   /* インテル(R) AVX-512 バイトおよびワード命令                                         */
#define   ippCPUID_AVX512DQ        0x02000000   /* インテル(R) AVX-512 ダブルワードおよびクワッドワード命令                           */
#define   ippCPUID_AVX512VL        0x04000000   /* インテル(R) AVX-512 ベクトル長拡張                                                 */
#define   ippCPUID_AVX512VBMI      0x08000000   /* インテル(R) AVX-512 ベクトルビット操作命令                                         */
#define   ippCPUID_MPX             0x10000000   /* インテル(R) メモリー・プロテクション・エクステンション                             */
#define   ippCPUID_AVX512_4FMADDPS 0x20000000   /* インテル(R) AVX-512 DL 単精度浮動小数点                                            */
#define   ippCPUID_AVX512_4VNNIW   0x40000000   /* インテル(R) AVX-512 DL 拡張ワード変数精度                                          */
#define   ippCPUID_KNC             0x80000000   /* インテル(R) Xeon Phi(TM) コプロセッサー                                            */

int main(int argc, char* argv[])
{
   const IppLibraryVersion *lib;
   IppStatus status;
   Ipp64u mask, emask;

   /* インテル(R) IPP Cryptography ライブラリーのバージョン情報を取得します */
   lib = ippcpGetLibVersion();
   printf("%s %s\n", lib->Name, lib->Version);

   /* CPU の機能と選択したライブラリー・レベルで有効な機能を取得します */
   status = ippcpGetCpuFeatures( &mask );
   if( ippStsNoErr == status ) {
      emask = ippcpGetEnabledCpuFeatures();
      printf("CPU でサポートされる機能\tインテル(R) IPP Cryptography でサポートされる機能\n");
      printf("-----------------------------------------\n");
      printf("  ippCPUID_MMX        = ");
      printf("%c\t%c\t",( mask & ippCPUID_MMX ) ? 'Y':'N',( emask & ippCPUID_MMX ) ? 'Y':'N');
      printf("インテル(R) MMX(R) テクノロジー\n");
      printf("  ippCPUID_SSE        = ");
      printf("%c\t%c\t",( mask & ippCPUID_SSE ) ? 'Y':'N',( emask & ippCPUID_SSE ) ? 'Y':'N');
      printf("インテル(R) SSE\n");
      printf("  ippCPUID_SSE2       = ");
      printf("%c\t%c\t",( mask & ippCPUID_SSE2 ) ? 'Y':'N',( emask & ippCPUID_SSE2 ) ? 'Y':'N');
      printf("インテル(R) SSE2\n");
      printf("  ippCPUID_SSE3       = ");
      printf("%c\t%c\t",( mask & ippCPUID_SSE3 ) ? 'Y':'N',( emask & ippCPUID_SSE3 ) ? 'Y':'N');
      printf("インテル(R) SSE3\n");
      printf("  ippCPUID_SSSE3      = ");
      printf("%c\t%c\t",( mask & ippCPUID_SSSE3 ) ? 'Y':'N',( emask & ippCPUID_SSSE3 ) ? 'Y':'N');
      printf("インテル(R) SSSE3\n");
      printf("  ippCPUID_MOVBE      = ");
      printf("%c\t%c\t",( mask & ippCPUID_MOVBE ) ? 'Y':'N',( emask & ippCPUID_MOVBE ) ? 'Y':'N');
      printf("プロセッサーによる MOVBE 命令のサポート\n");
      printf("  ippCPUID_SSE41      = ");
      printf("%c\t%c\t",( mask & ippCPUID_SSE41 ) ? 'Y':'N',( emask & ippCPUID_SSE41 ) ? 'Y':'N');
      printf("インテル(R) SSE4.1\n");
      printf("  ippCPUID_SSE42      = ");
      printf("%c\t%c\t",( mask & ippCPUID_SSE42 ) ? 'Y':'N',( emask & ippCPUID_SSE42 ) ? 'Y':'N');
      printf("インテル(R) SSE4.2\n");
      printf("  ippCPUID_AVX        = ");
      printf("%c\t%c\t",( mask & ippCPUID_AVX ) ? 'Y':'N',( emask & ippCPUID_AVX ) ? 'Y':'N');
      printf("インテル(R) AVX 命令セット\n");
      printf("  ippAVX_ENABLEDBYOS  = ");
      printf("%c\t%c\t",( mask & ippAVX_ENABLEDBYOS ) ? 'Y':'N',( emask & ippAVX_ENABLEDBYOS ) ? 'Y':'N');
      printf("OS によるインテル(R) AVX サポート\n");
      printf("  ippCPUID_AES        = ");
      printf("%c\t%c\t",( mask & ippCPUID_AES ) ? 'Y':'N',( emask & ippCPUID_AES ) ? 'Y':'N');
      printf("インテル(R) AES 命令\n");
      printf("  ippCPUID_SHA        = ");
      printf("%c\t%c\t",( mask & ippCPUID_SHA ) ? 'Y':'N',( emask & ippCPUID_SHA ) ? 'Y':'N');
      printf("インテル(R) SHA 命令\n");
      printf("  ippCPUID_CLMUL      = ");
      printf("%c\t%c\t",( mask & ippCPUID_CLMUL ) ? 'Y':'N',( emask & ippCPUID_CLMUL ) ? 'Y':'N');
      printf("PCLMULQDQ 命令\n");
      printf("  ippCPUID_RDRAND     = ");
      printf("%c\t%c\t",( mask & ippCPUID_RDRAND ) ? 'Y':'N',( emask & ippCPUID_RDRAND ) ? 'Y':'N');
      printf("乱数読み取り命令\n");
      printf("  ippCPUID_F16C       = ");
      printf("%c\t%c\t",( mask & ippCPUID_F16C ) ? 'Y':'N',( emask & ippCPUID_F16C ) ? 'Y':'N');
      printf("Float16 命令\n");
      printf("  ippCPUID_AVX2       = ");
      printf("%c\t%c\t",( mask & ippCPUID_AVX2 ) ? 'Y':'N',( emask & ippCPUID_AVX2 ) ? 'Y':'N');
      printf("インテル(R) AVX2 命令セット\n");
      printf("  ippCPUID_AVX512F    = ");
      printf("%c\t%c\t",( mask & ippCPUID_AVX512F ) ? 'Y':'N',( emask & ippCPUID_AVX512F ) ? 'Y':'N');
      printf("インテル(R) AVX-512 基本命令セット\n");
      printf("  ippCPUID_AVX512CD   = ");
      printf("%c\t%c\t",( mask & ippCPUID_AVX512CD ) ? 'Y':'N',( emask & ippCPUID_AVX512CD ) ? 'Y':'N');
      printf("インテル(R) AVX-512 競合検出命令セット\n");
      printf("  ippCPUID_AVX512ER   = ");
      printf("%c\t%c\t",( mask & ippCPUID_AVX512ER ) ? 'Y':'N',( emask & ippCPUID_AVX512ER ) ? 'Y':'N');
      printf("インテル(R) AVX-512 指数および逆数命令セット\n");
      printf("  ippCPUID_ADCOX      = ");
      printf("%c\t%c\t",( mask & ippCPUID_ADCOX ) ? 'Y':'N',( emask & ippCPUID_ADCOX ) ? 'Y':'N');
      printf("ADCX および ADOX 命令\n");
      printf("  ippCPUID_RDSEED     = ");
      printf("%c\t%c\t",( mask & ippCPUID_RDSEED ) ? 'Y':'N',( emask & ippCPUID_RDSEED ) ? 'Y':'N');
      printf("RDSEED 命令\n");
      printf("  ippCPUID_PREFETCHW  = ");
      printf("%c\t%c\t",( mask & ippCPUID_PREFETCHW ) ? 'Y':'N',( emask & ippCPUID_PREFETCHW ) ? 'Y':'N');
      printf("PREFETCHW 命令\n");
      printf("  ippCPUID_KNC        = ");
      printf("%c\t%c\t",( mask & ippCPUID_KNC ) ? 'Y':'N',( emask & ippCPUID_KNC ) ? 'Y':'N');
      printf("インテル(R) Xeon Phi(TM) コプロセッサー命令セット\n");
   }
   return 0;
}

このアプリケーションは、次の 2 つのセクションで構成されています。

  1. ライブラリーのレイヤー名とバージョンを取得します。
  2. ライブラリー・レイヤーで使用されるハードウェアの最適化と CPU でサポートされるハードウェアの最適化を示します。

上記のサンプルコードをビルドする場合は、次のステップを実行します。

  1. サンプルコードをコピーして、エディターにペーストします。
  2. シェルでコンパイラー変数とインテル® IPP Cryptography 変数が設定されていることを確認してください。環境変数の設定方法については、「準備」を参照してください。
  3. 次のコマンドを使用してコンパイルします: icc ippcptest.cpp -o ippcptest -I $IPPCRYPTOROOT/include -L $IPPCRYPTOROOT/lib/<arch> -lippcp
  4. アプリケーションを実行します。

トレーニングとドキュメント

製品の詳細については、以下のオンラインリソースを参照してください。

ドキュメント

説明

インテル® IPP Cryptography デベロッパー・ガイド (英語)

インテル® IPP Cryptography ライブラリーの設定、開発環境、リンクモードに関する詳細なガイダンスを提供します。

インテル® IPP Cryptography デベロッパー・リファレンス (英語)

インテル® IPP Cryptography 関数の詳細な説明が含まれます。

インテル® IPP 製品ページ (英語)

サポートとオンライン・ドキュメントに関する情報を入手できます。

日本語最新ドキュメント

日本語の最新ドキュメントを入手できます。

日本語最新情報

最新情報を日本語で参照できます。

注: ドキュメントのオフラインバージョンは、次のリンクからダウンロードできます。(リンク先のページは英語ですが、ダウンロード zip には英語と日本語の両方のドキュメントが含まれています。)

著作権と商標について

Intel、インテル、Intel ロゴ、Xeon、Intel Xeon Phi、MMX は、アメリカ合衆国および / またはその他の国における Intel Corporation またはその子会社の商標です。

* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

© 2017-2018 Intel Corporation.

本ソフトウェアおよび関連ドキュメントは、インテルが著作権を有する著作物であり、その使用には付随する明示的なライセンス (「ライセンス」) が適用されます。ライセンスで特に明記されていない限り、インテルから書面による許可を得た場合を除き、本ソフトウェアまたは関連ドキュメントを使用、改変、複製、公表、配布、公開することはできません。

本ソフトウェアおよび関連ドキュメントは現状のまま提供され、ライセンスに明記されているものを除き、明示されているか否かにかかわらず、いかなる保証もいたしません。

最適化に関する注意事項

インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2、インテル® ストリーミング SIMD 拡張命令 3、インテル® ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。

注意事項の改訂 #20110804