PadLock AESカーネルテストモジュール(1)


一、簡単に述べる


主にPadLock AESカーネルインタフェースをテスト検証する検証モジュールを作成した.PadLock AESカーネルインタフェースを適用して暗号解読を実現する.本明細書では、このモジュールを適用する方法、ステップ、原理、およびソースコードを提供する.

二、操作環境


オペレーティングシステム
mint17
コア
3.8.0
コンパイラ
gcc4.7.3
CPU
VIA Nano X2 L4530 @ 1.6+ GHz
メモリ
4G
たかく
2つ
 

三、主な原理


Linuxカーネルには暗号化された関数に関するインタフェースがあり、主にcrytoフォルダディレクトリにあります.AES,SHAなど多様なアルゴリズムの実装インタフェースがある.オンラインでは、Linuxカーネルの暗号化アルゴリズムのフレームワークについて多くの文章が紹介されており、Linuxカーネルのソースコードを読むことで、AESカーネル関数ライブラリを使用したカーネルモジュールが作成されています.
AES暗号化アルゴリズムを使用するには、主に4つの関数があります.
crypto_blkcipher_setkey
crypto_blkcipher_set_iv
crypto_blkcipher_encrypt
crypto_blkcipher_decrypt

これらの関数が正しく構成されているだけで、LinuxカーネルのAES暗号化ライブラリを正常に使用できます.これらの関数の使い方を紹介します.
static inline int crypto_blkcipher_setkey(struct crypto_blkcipher *tfm,
  const u8 *key, unsigned int keylen)
この関数は主に暗号化キーワードkeyを設定するために使用されます.ここでAESアルゴリズムの適用方法を説明する必要があり、アルゴリズムレベルでは、AESがkey(キーワード)、iv(初期化ベクトル)、暗号化モード(CBC/ECB/CBB/FB/OFBなど)、key-length(128/192/256)によって暗号化のモードを決定し、異なるモードによって同じ明文で暗号化された暗号文が異なる.crypto_blkcipher_setkey()関数は、そのkeyを設定します.*keyは鍵であり、keylenは鍵長である(単位バイトは16、24、32を選択可能)
次はcrypto_blkcipher*tfm、構造体これは暗号化コンテキストであり、暗号化の終始を貫くcrypto_blkcipher_setkey、crypto_blkcipher_set_ivはいずれもtfmという構造体を設定するために用いられ,暗号化構成の担体である.
struct crypto_blkcipher {
struct crypto_tfm base;
};
 
struct crypto_tfm {
 
u32 crt_flags;
union { 
struct ablkcipher_tfm ablkcipher;
struct aead_tfm aead;
struct blkcipher_tfm blkcipher;
struct cipher_tfm cipher;
struct hash_tfm hash;
struct compress_tfm compress;
struct rng_tfm rng;
} crt_u;   // 
void (*exit)(struct crypto_tfm *tfm); // 
struct crypto_alg *__crt_alg;
void *__crt_ctx[] CRYPTO_MINALIGN_ATTR;
};

真ん中のunionと上のdefineの山から分かるように、この構造からまたxxxのグループが分散することができます.tfm.crypto_alg対応cipher_tfm.最後のパラメータ_crt_ctx[]は、上記のアルゴリズムコンテキストです.すなわち,アルゴリズムコンテキストはtfmとともに割り当てられる.tfmからctxを得ることができます.Linuxは関数inline void*crypto_を提供しています.tfm_ctx(struct crypto_tfm *tfm);変換を行い、この関数も/include/linux/cryptoである.h中.
crypto_について説明しますblkcipher_set_iv関数
static inline void crypto_blkcipher_set_iv(struct crypto_blkcipher *tfm,
   const u8 *src, unsigned int len)
その機能はiv(初期化ベクトル)を設定することです.srcはiv値,lenはivの長さ,tfmは前述と同様である.
コア暗号化関数crypto_について説明しますblkcipher_encrypt_iv:
static inline int crypto_blkcipher_encrypt(struct blkcipher_desc *desc,
      struct scatterlist *dst,
      struct scatterlist *src,
      unsigned int nbytes)

その機能は暗号化を実現することです.0を返すと正しく、1はエラーです.*descは暗号化コンテキスト構造体で、上にset_ivとset_キーはこのblkcipherを設定するために使用されますdesc構造体の、
プロトタイプ:
struct blkcipher_desc {
struct crypto_blkcipher *tfm;
void *info;
u32 flags;
};

ここで、tfmは、ブロック暗号化のハッシュ・シーケンス・ツール(scatterwalk)が初期化時にinfoをivとして直接使用するため、以前に述べた暗号化コンテキストであり、infoは通常ivを格納するために使用される.
ハッシュ・シーケンス(scatterlist)は何ですか?【1】
Linuxカーネルでは、外付け機器と付き合うには、IO、ポート、DMAの3つの方法があり、この教科書では説明されています.ここでDMA方式は、DMAコントローラによってメモリ、周辺機器間のデータ転送を制御するものである.Linuxのアドレス空間には、仮想アドレス、物理アドレス、バスアドレスの3種類があることを知っています.DMAは、伝送されるたびに、連続したバスアドレス空間上にデータ全体が分布することを要求する.DMAは、大きなブロックデータを伝送するために設計されるが、大きなブロックの連続バスアドレス空間は、通常、希少である.そのため、連続空間がそれほど多くない場合、大きなブロックデータをできるだけ少ない小さなブロック連続アドレスに分散させ、DMAコントローラにデータを次々と転送させるしかない.従ってLinuxカーネルでは、ハッシュシーケンス(scatterlist)と呼ばれるデータ構造が、小さなブロックの連続バスアドレスを直列に接続し、DMA駆動に渡して自動的に次から次へと伝送するように設計されている.
言い換えれば、scatterlistはチェーンテーブルであっても配列であってもよい線形テーブルであり、各要素はバスアドレスの連続するメモリブロックを指すポインタを含み、DMAのためにカスタマイズされたデータ構造である.
scatterlist 
struct scatterlist {
#ifdef CONFIG_DEBUG_SG
unsigned long	sg_magic;     
#endif
unsigned long	page_link;     // 
unsigned int	offset;            // 
unsigned int	length;           // 
dma_addr_t	dma_address;
#ifdef CONFIG_NEED_SG_DMA_LENGTH
unsigned int	dma_length;
#endif
};

ここでscatterwalkに空間を割り当て、データ利用関数を設定します.
sg_init_one().
scatterwalkは物理メモリの動作であり、DMAの伝送を容易にする.しかし,Linuxカーネルでの動作の多くは仮想メモリの処理(データprintkの表示)であるため,scatterwalkを適用するとともに,仮想メモリにマッピングして利用する(kmap)必要があり,後述する実装プログラムで紹介する.
dstは宛先アドレス,srcは元データ,nbytesは処理バイトである.
crypto_blkcipher_decrypt :
static inline int crypto_blkcipher_decrypt(struct blkcipher_desc *desc,
   struct scatterlist *dst,
   struct scatterlist *src,
   unsigned int nbytes)

この関数の役割は復号化であり,暗号化アルゴリズムパラメータと同様であり,これ以上述べない.