ltq-deu: make cipher/digest usable by openssl
[openwrt/staging/noltari.git] / package / kernel / lantiq / ltq-deu / src / ifxmips_des.c
index dcf6c18a98748768f69bc1b7905e23e708429441..7bb14b4d579027cd5362e6fb6368ac83a24715da 100644 (file)
@@ -416,7 +416,8 @@ int des3_ede_setkey(struct crypto_tfm *tfm, const u8 *key,
 struct crypto_alg ifxdeu_des_alg = {
         .cra_name               =       "des",
         .cra_driver_name        =       "ifxdeu-des",
-        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
+        .cra_priority           =       300,
+        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER | CRYPTO_ALG_KERN_DRIVER_ONLY,
         .cra_blocksize          =       DES_BLOCK_SIZE,
         .cra_ctxsize            =       sizeof(struct des_ctx),
         .cra_module             =       THIS_MODULE,
@@ -436,7 +437,8 @@ struct crypto_alg ifxdeu_des_alg = {
 struct crypto_alg ifxdeu_des3_ede_alg = {
         .cra_name               =       "des3_ede",
         .cra_driver_name        =       "ifxdeu-des3_ede",
-        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
+        .cra_priority           =       300,
+        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER | CRYPTO_ALG_KERN_DRIVER_ONLY,
         .cra_blocksize          =       DES_BLOCK_SIZE,
         .cra_ctxsize            =       sizeof(struct des_ctx),
         .cra_module             =       THIS_MODULE,
@@ -465,14 +467,15 @@ int ecb_des_encrypt(struct blkcipher_desc *desc,
         struct des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
         struct blkcipher_walk walk;
         int err;
+        unsigned int enc_bytes;
 
         blkcipher_walk_init(&walk, dst, src, nbytes);
         err = blkcipher_walk_virt(desc, &walk);
 
-        while ((nbytes = walk.nbytes)) {
-                nbytes -= (nbytes % DES_BLOCK_SIZE); 
+        while ((nbytes = enc_bytes = walk.nbytes)) {
+                enc_bytes -= (nbytes % DES_BLOCK_SIZE);
                 ifx_deu_des_ecb(ctx, walk.dst.virt.addr, walk.src.virt.addr, 
-                               NULL, nbytes, CRYPTO_DIR_ENCRYPT, 0);
+                               NULL, enc_bytes, CRYPTO_DIR_ENCRYPT, 0);
                 nbytes &= DES_BLOCK_SIZE - 1;
                 err = blkcipher_walk_done(desc, &walk, nbytes);
         }
@@ -496,15 +499,16 @@ int ecb_des_decrypt(struct blkcipher_desc *desc,
         struct des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
         struct blkcipher_walk walk;
         int err;
+        unsigned int dec_bytes;
 
         DPRINTF(1, "\n");
         blkcipher_walk_init(&walk, dst, src, nbytes);
         err = blkcipher_walk_virt(desc, &walk);
 
-        while ((nbytes = walk.nbytes)) {
-                nbytes -= (nbytes % DES_BLOCK_SIZE); 
+        while ((nbytes = dec_bytes = walk.nbytes)) {
+                dec_bytes -= (nbytes % DES_BLOCK_SIZE);
                 ifx_deu_des_ecb(ctx, walk.dst.virt.addr, walk.src.virt.addr, 
-                               NULL, nbytes, CRYPTO_DIR_DECRYPT, 0);
+                               NULL, dec_bytes, CRYPTO_DIR_DECRYPT, 0);
                 nbytes &= DES_BLOCK_SIZE - 1;
                 err = blkcipher_walk_done(desc, &walk, nbytes);
         }
@@ -518,7 +522,8 @@ int ecb_des_decrypt(struct blkcipher_desc *desc,
 struct crypto_alg ifxdeu_ecb_des_alg = {
         .cra_name               =       "ecb(des)",
         .cra_driver_name        =       "ifxdeu-ecb(des)",
-        .cra_flags              =       CRYPTO_ALG_TYPE_BLKCIPHER,
+        .cra_priority           =       400,
+        .cra_flags              =       CRYPTO_ALG_TYPE_BLKCIPHER | CRYPTO_ALG_KERN_DRIVER_ONLY,
         .cra_blocksize          =       DES_BLOCK_SIZE,
         .cra_ctxsize            =       sizeof(struct des_ctx),
         .cra_type               =       &crypto_blkcipher_type,
@@ -541,7 +546,8 @@ struct crypto_alg ifxdeu_ecb_des_alg = {
 struct crypto_alg ifxdeu_ecb_des3_ede_alg = {
         .cra_name               =       "ecb(des3_ede)",
         .cra_driver_name        =       "ifxdeu-ecb(des3_ede)",
-        .cra_flags              =       CRYPTO_ALG_TYPE_BLKCIPHER,
+        .cra_priority           =       400,
+        .cra_flags              =       CRYPTO_ALG_TYPE_BLKCIPHER | CRYPTO_ALG_KERN_DRIVER_ONLY,
         .cra_blocksize          =       DES3_EDE_BLOCK_SIZE,
         .cra_ctxsize            =       sizeof(struct des_ctx),
         .cra_type               =       &crypto_blkcipher_type,
@@ -574,16 +580,17 @@ int cbc_des_encrypt(struct blkcipher_desc *desc,
         struct des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
         struct blkcipher_walk walk;
         int err;
+        unsigned int enc_bytes;
 
         DPRINTF(1, "\n");
         blkcipher_walk_init(&walk, dst, src, nbytes);
         err = blkcipher_walk_virt(desc, &walk);
 
-        while ((nbytes = walk.nbytes)) {
+        while ((nbytes = enc_bytes = walk.nbytes)) {
                 u8 *iv = walk.iv;
-                nbytes -= (nbytes % DES_BLOCK_SIZE); 
+                enc_bytes -= (nbytes % DES_BLOCK_SIZE);
                 ifx_deu_des_cbc(ctx, walk.dst.virt.addr, walk.src.virt.addr, 
-                               iv, nbytes, CRYPTO_DIR_ENCRYPT, 0);      
+                               iv, enc_bytes, CRYPTO_DIR_ENCRYPT, 0);
                 nbytes &= DES_BLOCK_SIZE - 1;
                 err = blkcipher_walk_done(desc, &walk, nbytes);
         }
@@ -607,16 +614,17 @@ int cbc_des_decrypt(struct blkcipher_desc *desc,
         struct des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
         struct blkcipher_walk walk;
         int err;
+        unsigned int dec_bytes;
 
         DPRINTF(1, "\n");
         blkcipher_walk_init(&walk, dst, src, nbytes);
         err = blkcipher_walk_virt(desc, &walk);
 
-        while ((nbytes = walk.nbytes)) {
+        while ((nbytes = dec_bytes = walk.nbytes)) {
                 u8 *iv = walk.iv;
-                nbytes -= (nbytes % DES_BLOCK_SIZE); 
+                dec_bytes -= (nbytes % DES_BLOCK_SIZE);
                 ifx_deu_des_cbc(ctx, walk.dst.virt.addr, walk.src.virt.addr, 
-                               iv, nbytes, CRYPTO_DIR_DECRYPT, 0);
+                               iv, dec_bytes, CRYPTO_DIR_DECRYPT, 0);
                 nbytes &= DES_BLOCK_SIZE - 1;
                 err = blkcipher_walk_done(desc, &walk, nbytes);
         }
@@ -630,7 +638,8 @@ int cbc_des_decrypt(struct blkcipher_desc *desc,
 struct crypto_alg ifxdeu_cbc_des_alg = {
         .cra_name               =       "cbc(des)",
         .cra_driver_name        =       "ifxdeu-cbc(des)",
-        .cra_flags              =       CRYPTO_ALG_TYPE_BLKCIPHER,
+        .cra_priority           =       400,
+        .cra_flags              =       CRYPTO_ALG_TYPE_BLKCIPHER | CRYPTO_ALG_KERN_DRIVER_ONLY,
         .cra_blocksize          =       DES_BLOCK_SIZE,
         .cra_ctxsize            =       sizeof(struct des_ctx),
         .cra_type               =       &crypto_blkcipher_type,
@@ -654,7 +663,8 @@ struct crypto_alg ifxdeu_cbc_des_alg = {
 struct crypto_alg ifxdeu_cbc_des3_ede_alg = {
         .cra_name               =       "cbc(des3_ede)",
         .cra_driver_name        =       "ifxdeu-cbc(des3_ede)",
-        .cra_flags              =       CRYPTO_ALG_TYPE_BLKCIPHER,
+        .cra_priority           =       400,
+        .cra_flags              =       CRYPTO_ALG_TYPE_BLKCIPHER | CRYPTO_ALG_KERN_DRIVER_ONLY,
         .cra_blocksize          =       DES3_EDE_BLOCK_SIZE,
         .cra_ctxsize            =       sizeof(struct des_ctx),
         .cra_type               =       &crypto_blkcipher_type,
@@ -672,25 +682,15 @@ struct crypto_alg ifxdeu_cbc_des3_ede_alg = {
         }
 };
 
-/*! \fn int __init ifxdeu_init_des (void)
+/*! \fn int ifxdeu_init_des (void)
  *  \ingroup IFX_DES_FUNCTIONS
  *  \brief initialize des driver      
 */                                 
-int __init ifxdeu_init_des (void)
+int ifxdeu_init_des (void)
 {
     int ret = -ENOSYS;
 
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))
-     if (!disable_multiblock) {
-                ifxdeu_des_alg.cra_u.cipher.cia_max_nbytes = DES_BLOCK_SIZE;    //(size_t)-1;
-                ifxdeu_des_alg.cra_u.cipher.cia_req_align = 16;
-                ifxdeu_des_alg.cra_u.cipher.cia_ecb = ifx_deu_des_ecb;
-                ifxdeu_des_alg.cra_u.cipher.cia_cbc = ifx_deu_des_cbc;
-                ifxdeu_des_alg.cra_u.cipher.cia_cfb = ifx_deu_des_cfb;
-                ifxdeu_des_alg.cra_u.cipher.cia_ofb = ifx_deu_des_ofb;
-        }
-#endif
+        des_chip_init();
 
         ret = crypto_register_alg(&ifxdeu_des_alg);
         if (ret < 0)
@@ -716,7 +716,6 @@ int __init ifxdeu_init_des (void)
         if (ret < 0)
                 goto cbc_des3_ede_err;
 
-        des_chip_init();
         CRTCL_SECT_INIT;
 
 
@@ -751,11 +750,11 @@ cbc_des3_ede_err:
 
 }
 
-/*! \fn void __exit ifxdeu_fini_des (void)
+/*! \fn void ifxdeu_fini_des (void)
  *  \ingroup IFX_DES_FUNCTIONS
  *  \brief unregister des driver    
 */                                 
-void __exit ifxdeu_fini_des (void)
+void ifxdeu_fini_des (void)
 {
         crypto_unregister_alg (&ifxdeu_des_alg);
         crypto_unregister_alg (&ifxdeu_ecb_des_alg);