Validation of cbc(des3_ede) ??

"Kevin Coffman" <[email protected]>
Newsgroups gmane.linux.cryptography
Message-ID <[email protected]>
Assuming I am using it correctly, I am getting the wrong output from
"cbc(des3_ede)" according to  the Triple-DES test vectors I found
here:
http://csrc.nist.gov/groups/STM/cavp/documents/des/tripledes-vectors.zip

I also tried "ecb(des3_ede)".

When I test "cbc(des)", I see the expected output according to
http://www.itl.nist.gov/fipspubs/fip81.htm

Below is my test routine and the output I see on i386 and x86_64.  (I
have left out the definition of print_hexl() for brevity.):

I began looking at this because I am failing interoperability with a
Solaris implementation.

Can someone tell me if I'm doing something wrong, or if there is a
problem with the des3 kernel code?
(This is on 2.6.23-rc9)

Thanks,
K.C.

------------------------------------------------------------------------------------------------------------------------------------------

static void KWC_ENCRYPT_TEST(void)
{
#define USE_DES 0

#if USE_DES
#define KEYLEN 8
#define DATALEN 32
#define PLAINLEN 24
#define BLOCKSIZE 8
       char *cryptoname = "cbc(des)";
       u8 key[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef};
#else
#define KEYLEN 24
#define DATALEN 32
#define PLAINLEN 24
#define BLOCKSIZE 8
       char *cryptoname = "cbc(des3_ede)";     /* ecb(des3_ede) */
       u8 key[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
                   0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01,
                   0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef};
#endif
       u8 iv[BLOCKSIZE] =
           {0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef};
       u8 iv2[BLOCKSIZE] =
           {0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef};
       u8 plaintext[PLAINLEN] =
           {0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
            0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20,
            0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20};
       u8 encrypted[DATALEN] = {0x00};
       u8 decrypted[DATALEN] = {0x00};
       struct crypto_blkcipher *cipher = NULL, *cipher2 = NULL;
       struct scatterlist sg_in, sg_out;
       struct blkcipher_desc bd, bd2;
       int ivsize;
       int cryptlen = PLAINLEN;
       u32 ret;

       print_hexl("key[]", (u32 *)key, KEYLEN, 0);
       print_hexl("iv[]", (u32 *)iv, BLOCKSIZE, 0);
       print_hexl("iv2[]", (u32 *)iv2, BLOCKSIZE, 0);

       printk("%s: Allocating %s blkciphers\n", __func__, cryptoname);
       cipher = crypto_alloc_blkcipher(cryptoname, 0, CRYPTO_ALG_ASYNC);
       if (IS_ERR(cipher)) {
               printk("%s: Error allocating %s blkcipher %ld\n",
                       __func__, cryptoname, PTR_ERR(cipher));
               goto cleanup_nofree;
       }
       ret = crypto_blkcipher_setkey(cipher, key, KEYLEN);
       if (ret) {
               printk("%s: Error %d, setting key.  crt_flags 0x%08x\n",
                       __func__, ret, crypto_tfm_get_flags(&cipher->base));
               goto cleanup;
       }

       cipher2 = crypto_alloc_blkcipher(cryptoname, 0, CRYPTO_ALG_ASYNC);
       if (IS_ERR(cipher2)) {
               printk("%s: Error allocating %s blkcipher2 %ld\n",
                       __func__, cryptoname, PTR_ERR(cipher2));
               goto cleanup_nofree;
       }
       ret = crypto_blkcipher_setkey(cipher2, key, KEYLEN);
       if (ret) {
               printk("%s: Error %d, setting key2.  crt_flags 0x%08x\n",
                       __func__, ret, crypto_tfm_get_flags(&cipher2->base));
               goto cleanup;
       }

       ivsize = crypto_blkcipher_ivsize(cipher);
       printk("%s: the expected iv size is %d\n", __func__, ivsize);

       bd.tfm = cipher;
       bd.info = iv;

       print_hexl("(A) The plaintext data", (u32 *)plaintext, PLAINLEN, 0);
       print_hexl("(A) The encrypted data", (u32 *)encrypted, DATALEN, 0);
       print_hexl("(A) The decrypted data", (u32 *)decrypted, DATALEN, 0);
       sg_set_buf(&sg_in, plaintext, cryptlen);
       sg_set_buf(&sg_out, encrypted, cryptlen);
       ret = crypto_blkcipher_encrypt_iv(&bd, &sg_out, &sg_in, cryptlen);
       if (ret) {
               printk("%s: encrypt returned %d\n", __func__, ret);
               goto cleanup;
       }
       print_hexl("(B) The plaintext data", (u32 *)plaintext, PLAINLEN, 0);
       print_hexl("(B) The encrypted data", (u32 *)encrypted, PLAINLEN, 0);
       print_hexl("(B) The decrypted data", (u32 *)decrypted, DATALEN, 0);

       bd2.tfm = cipher2;
       bd2.info = iv2;

       sg_set_buf(&sg_in, encrypted, cryptlen);
       sg_set_buf(&sg_out, decrypted, cryptlen);
       ret = crypto_blkcipher_decrypt_iv(&bd2, &sg_out, &sg_in, cryptlen);
       if (ret) {
               printk("%s: decrypt returned %d\n", __func__, ret);
               goto cleanup;
       }
       print_hexl("(C) The plaintext data", (u32 *)plaintext, PLAINLEN, 0);
       print_hexl("(C) The encrypted data", (u32 *)encrypted, PLAINLEN, 0);
       print_hexl("(C) The decrypted data", (u32 *)decrypted, DATALEN, 0);

cleanup:
       crypto_free_blkcipher(cipher);
       crypto_free_blkcipher(cipher2);
cleanup_nofree:
       return;
}

----------------------------------------------------

kernel: RPC:       key[]; length 24
kernel:   0000: 0123 4567 89ab cdef 2345 6789 abcd ef01  .#Eg.«Íï#Eg.«Íï.
kernel:   0010: 0123 4567 89ab cdef                      .#Eg.«Íï
kernel:
kernel: RPC:       iv[]; length 8
kernel:   0000: 1234 5678 90ab cdef                      .4Vx.«Íï
kernel:
kernel: RPC:       iv2[]; length 8
kernel:   0000: 1234 5678 90ab cdef                      .4Vx.«Íï
kernel:
kernel: KWC_ENCRYPT_TEST: Allocating cbc(des3_ede) blkciphers
kernel: KWC_ENCRYPT_TEST: the expected iv size is 8
kernel: RPC:       (A) The plaintext data; length 24
kernel:   0000: 4e6f 7720 6973 2074 6865 2074 696d 6520  Now is the time
kernel:   0010: 666f 7220 616c 6c20                      for all
kernel:
kernel: RPC:       (A) The encrypted data; length 32
kernel:   0000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
kernel:   0010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
kernel:
kernel: RPC:       (A) The decrypted data; length 32
kernel:   0000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
kernel:   0010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
kernel:
kernel: RPC:       (B) The plaintext data; length 24
kernel:   0000: 4e6f 7720 6973 2074 6865 2074 696d 6520  Now is the time
kernel:   0010: 666f 7220 616c 6c20                      for all
kernel:
kernel: RPC:       (B) The encrypted data; length 24
kernel:   0000: 134b 98f8 eeb3 f607 9f1a 82e0 640d 5f2f  .K.øî³ö....àd._/
kernel:   0010: 8e09 0661 c428 64a1                      ...aÄ(d¡
kernel:
kernel: RPC:       (B) The decrypted data; length 32
kernel:   0000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
kernel:   0010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
kernel:
kernel: RPC:       (C) The plaintext data; length 24
kernel:   0000: 4e6f 7720 6973 2074 6865 2074 696d 6520  Now is the time
kernel:   0010: 666f 7220 616c 6c20                      for all
kernel:
kernel: RPC:       (C) The encrypted data; length 24
kernel:   0000: 134b 98f8 eeb3 f607 9f1a 82e0 640d 5f2f  .K.øî³ö....àd._/
kernel:   0010: 8e09 0661 c428 64a1                      ...aÄ(d¡
kernel:
kernel: RPC:       (C) The decrypted data; length 32
kernel:   0000: 4e6f 7720 6973 2074 6865 2074 696d 6520  Now is the time
kernel:   0010: 666f 7220 616c 6c20 0000 0000 0000 0000  for all ........
kernel:

-
Linux-crypto:  cryptography in and on the Linux system
Archive:       http://mail.nl.linux.org/linux-crypto/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.