The unified diff between revisions [0f5d9bbd..] and [a78ba44a..] is displayed below. It can also be downloaded as a raw diff.

#
#
# add_file "botan/des.cpp"
#  content [8b763d83ca4d1febab40f06292fdbfdff2ba8142]
#
# add_file "botan/des.h"
#  content [769c08188bd776f17a84c887ef1aba7d19e18c63]
#
# add_file "botan/des_tab.cpp"
#  content [9ce42b4de43fb7cf599b1bad7c69b0e167543656]
#
# add_file "botan/pkcs5.cpp"
#  content [cdf709aac78dc4cf416125512278e117589bf8e6]
#
# add_file "botan/pkcs5.h"
#  content [660436fb11b2f632b3dba051539cf93d023ffaa6]
#
# patch "ChangeLog"
#  from [e3cb4410fbf089f5ba258314b15d2fb0494ec871]
#    to [685c474f29d68ac662b431cc8e412343789e1e6d]
#
# patch "Makefile.am"
#  from [c3ca41e70b719d5d345383a893a7d4ba7823160c]
#    to [09c4fb85c475a9a65d1367de3a4a9ce7c262f081]
#
# patch "botan/algolist.cpp"
#  from [e73a701e948afdcb723a29f89e88dbc793764d76]
#    to [1f97304bc111e2f3ea06915975b63ec1c359b090]
#
# patch "commands.cc"
#  from [5e3307a36823404a734e65224da9966461d8e382]
#    to [10b5b48c3a9202ae481022dd03ddc778343ab16d]
#
# patch "database.cc"
#  from [a1452325ac8f6aef8804ec53785ecbac5ee4cea6]
#    to [2859331985e8687cd337886ff960d6ce0d6be7ae]
#
# patch "keys.cc"
#  from [0a144d76856af7fe643c529d9d2536a197fe15cb]
#    to [b43ff403dae506d2958e518965ed12c57dc1d93a]
#
# patch "keys.hh"
#  from [ec2036295cdf27e6ac7994fb9952360c364221f6]
#    to [37f54b83f95952ba438899513ca0991cc63d4d10]
#
# patch "packet.cc"
#  from [f4ca19df46ef590bb112762f222325ae2ddb98be]
#    to [ef8866949aab6ca49284575de0c4c63494efe3d1]
#
# patch "po/fr.po"
#  from [2385bcc193a5aa321863cda06106737be42a1bee]
#    to [d7aef69713125651e61b6d37b9377ae69a3fb561]
#
# patch "sanity.cc"
#  from [d43cf000a18c156b97527e0724635b050159d16d]
#    to [6a638085b01e1178573585233adc5eb5848b5207]
#
# patch "vocab.cc"
#  from [cebf734fb6a83a66665786e2c1486d4934137066]
#    to [023a5cc51fde8562c2d21f7b06fb11e0cf68b672]
#
# patch "vocab.hh"
#  from [f14bf372280ec9b5bc886598249ec518dfa114d3]
#    to [06422180e56f9298d0c8c91387d10c7db8283199]
#
# patch "vocab_terms.hh"
#  from [9abc8225074b278d3b7a57c291ab5d8fd0a98ea6]
#    to [64c7b6e84baa98c36e9811817b548ba4adecb8d2]
#
============================================================
--- botan/des.cpp	8b763d83ca4d1febab40f06292fdbfdff2ba8142
+++ botan/des.cpp	8b763d83ca4d1febab40f06292fdbfdff2ba8142
@@ -0,0 +1,256 @@
+/*************************************************
+* DES Source File                                *
+* (C) 1999-2005 The Botan Project                *
+*************************************************/
+
+#include <botan/des.h>
+
+namespace Botan {
+
+/*************************************************
+* DES Encryption                                 *
+*************************************************/
+void DES::enc(const byte in[], byte out[]) const
+   {
+   u32bit left  = make_u32bit(in[0], in[1], in[2], in[3]),
+          right = make_u32bit(in[4], in[5], in[6], in[7]);
+   IP(left, right);       round(left, right, 0); round(right, left, 1);
+   round(left, right, 2); round(right, left, 3); round(left, right, 4);
+   round(right, left, 5); round(left, right, 6); round(right, left, 7);
+   round(left, right, 8); round(right, left, 9); round(left, right,10);
+   round(right, left,11); round(left, right,12); round(right, left,13);
+   round(left, right,14); round(right, left,15); FP(left, right);
+   out[0] = get_byte(0, right); out[1] = get_byte(1, right);
+   out[2] = get_byte(2, right); out[3] = get_byte(3, right);
+   out[4] = get_byte(0, left);  out[5] = get_byte(1, left);
+   out[6] = get_byte(2, left);  out[7] = get_byte(3, left);
+   }
+
+/*************************************************
+* DES Decryption                                 *
+*************************************************/
+void DES::dec(const byte in[], byte out[]) const
+   {
+   u32bit left  = make_u32bit(in[0], in[1], in[2], in[3]),
+          right = make_u32bit(in[4], in[5], in[6], in[7]);
+   IP(left, right);       round(left, right,15); round(right, left,14);
+   round(left, right,13); round(right, left,12); round(left, right,11);
+   round(right, left,10); round(left, right, 9); round(right, left, 8);
+   round(left, right, 7); round(right, left, 6); round(left, right, 5);
+   round(right, left, 4); round(left, right, 3); round(right, left, 2);
+   round(left, right, 1); round(right, left, 0); FP(left, right);
+   out[0] = get_byte(0, right); out[1] = get_byte(1, right);
+   out[2] = get_byte(2, right); out[3] = get_byte(3, right);
+   out[4] = get_byte(0, left);  out[5] = get_byte(1, left);
+   out[6] = get_byte(2, left);  out[7] = get_byte(3, left);
+   }
+
+/*************************************************
+* DES Round                                      *
+*************************************************/
+void DES::round(u32bit& left, u32bit right, u32bit n) const
+   {
+   u32bit T1 = rotate_right(right, 4) ^ round_key[2*n],
+          T2 =              right     ^ round_key[2*n + 1];
+   left ^= SPBOX1[get_byte(0, T1)] ^ SPBOX2[get_byte(0, T2)] ^
+           SPBOX3[get_byte(1, T1)] ^ SPBOX4[get_byte(1, T2)] ^
+           SPBOX5[get_byte(2, T1)] ^ SPBOX6[get_byte(2, T2)] ^
+           SPBOX7[get_byte(3, T1)] ^ SPBOX8[get_byte(3, T2)];
+   }
+
+/*************************************************
+* DES Initial Permutation                        *
+*************************************************/
+void DES::IP(u32bit& L, u32bit& R)
+   {
+   u64bit T = (IPTAB1[get_byte(0, L)]     ) | (IPTAB1[get_byte(1, L)] << 1) |
+              (IPTAB1[get_byte(2, L)] << 2) | (IPTAB1[get_byte(3, L)] << 3) |
+              (IPTAB1[get_byte(0, R)] << 4) | (IPTAB1[get_byte(1, R)] << 5) |
+              (IPTAB1[get_byte(2, R)] << 6) | (IPTAB2[get_byte(3, R)]     );
+   L = (u32bit)((T >> 32) & 0xFFFFFFFF);
+   R = (u32bit)((T      ) & 0xFFFFFFFF);
+   }
+
+/*************************************************
+* DES Final Permutation                          *
+*************************************************/
+void DES::FP(u32bit& L, u32bit& R)
+   {
+   u64bit T = (FPTAB1[get_byte(0, L)] << 5) | (FPTAB1[get_byte(1, L)] << 3) |
+              (FPTAB1[get_byte(2, L)] << 1) | (FPTAB2[get_byte(3, L)] << 1) |
+              (FPTAB1[get_byte(0, R)] << 4) | (FPTAB1[get_byte(1, R)] << 2) |
+              (FPTAB1[get_byte(2, R)]     ) | (FPTAB2[get_byte(3, R)]     );
+   L = (u32bit)((T >> 32) & 0xFFFFFFFF);
+   R = (u32bit)((T      ) & 0xFFFFFFFF);
+   }
+
+/*************************************************
+* DES Raw Encryption                             *
+*************************************************/
+void DES::raw_encrypt(u32bit& left, u32bit& right) const
+   {
+   round(left, right, 0); round(right, left, 1); round(left, right, 2);
+   round(right, left, 3); round(left, right, 4); round(right, left, 5);
+   round(left, right, 6); round(right, left, 7); round(left, right, 8);
+   round(right, left, 9); round(left, right,10); round(right, left,11);
+   round(left, right,12); round(right, left,13); round(left, right,14);
+   round(right, left,15);
+   }
+
+/*************************************************
+* DES Raw Decryption                             *
+*************************************************/
+void DES::raw_decrypt(u32bit& left, u32bit& right) const
+   {
+   round(left, right,15); round(right, left,14); round(left, right,13);
+   round(right, left,12); round(left, right,11); round(right, left,10);
+   round(left, right, 9); round(right, left, 8); round(left, right, 7);
+   round(right, left, 6); round(left, right, 5); round(right, left, 4);
+   round(left, right, 3); round(right, left, 2); round(left, right, 1);
+   round(right, left, 0);
+   }
+
+/*************************************************
+* DES Key Schedule                               *
+*************************************************/
+void DES::key(const byte key[], u32bit)
+   {
+   static const byte ROT[16] = { 1, 1, 2, 2, 2, 2, 2, 2,
+                                 1, 2, 2, 2, 2, 2, 2, 1 };
+   u32bit C = ((key[7] & 0x80) << 20) | ((key[6] & 0x80) << 19) |
+              ((key[5] & 0x80) << 18) | ((key[4] & 0x80) << 17) |
+              ((key[3] & 0x80) << 16) | ((key[2] & 0x80) << 15) |
+              ((key[1] & 0x80) << 14) | ((key[0] & 0x80) << 13) |
+              ((key[7] & 0x40) << 13) | ((key[6] & 0x40) << 12) |
+              ((key[5] & 0x40) << 11) | ((key[4] & 0x40) << 10) |
+              ((key[3] & 0x40) <<  9) | ((key[2] & 0x40) <<  8) |
+              ((key[1] & 0x40) <<  7) | ((key[0] & 0x40) <<  6) |
+              ((key[7] & 0x20) <<  6) | ((key[6] & 0x20) <<  5) |
+              ((key[5] & 0x20) <<  4) | ((key[4] & 0x20) <<  3) |
+              ((key[3] & 0x20) <<  2) | ((key[2] & 0x20) <<  1) |
+              ((key[1] & 0x20)      ) | ((key[0] & 0x20) >>  1) |
+              ((key[7] & 0x10) >>  1) | ((key[6] & 0x10) >>  2) |
+              ((key[5] & 0x10) >>  3) | ((key[4] & 0x10) >>  4);
+   u32bit D = ((key[7] & 0x02) << 26) | ((key[6] & 0x02) << 25) |
+              ((key[5] & 0x02) << 24) | ((key[4] & 0x02) << 23) |
+              ((key[3] & 0x02) << 22) | ((key[2] & 0x02) << 21) |
+              ((key[1] & 0x02) << 20) | ((key[0] & 0x02) << 19) |
+              ((key[7] & 0x04) << 17) | ((key[6] & 0x04) << 16) |
+              ((key[5] & 0x04) << 15) | ((key[4] & 0x04) << 14) |
+              ((key[3] & 0x04) << 13) | ((key[2] & 0x04) << 12) |
+              ((key[1] & 0x04) << 11) | ((key[0] & 0x04) << 10) |
+              ((key[7] & 0x08) <<  8) | ((key[6] & 0x08) <<  7) |
+              ((key[5] & 0x08) <<  6) | ((key[4] & 0x08) <<  5) |
+              ((key[3] & 0x08) <<  4) | ((key[2] & 0x08) <<  3) |
+              ((key[1] & 0x08) <<  2) | ((key[0] & 0x08) <<  1) |
+              ((key[3] & 0x10) >>  1) | ((key[2] & 0x10) >>  2) |
+              ((key[1] & 0x10) >>  3) | ((key[0] & 0x10) >>  4);
+   for(u32bit j = 0; j != 16; j++)
+      {
+      C = ((C << ROT[j]) | (C >> (28-ROT[j]))) & 0x0FFFFFFF;
+      D = ((D << ROT[j]) | (D >> (28-ROT[j]))) & 0x0FFFFFFF;
+      round_key[2*j  ] = ((C & 0x00000010) << 22) | ((C & 0x00000800) << 17) |
+                         ((C & 0x00000020) << 16) | ((C & 0x00004004) << 15) |
+                         ((C & 0x00000200) << 11) | ((C & 0x00020000) << 10) |
+                         ((C & 0x01000000) >>  6) | ((C & 0x00100000) >>  4) |
+                         ((C & 0x00010000) <<  3) | ((C & 0x08000000) >>  2) |
+                         ((C & 0x00800000) <<  1) | ((D & 0x00000010) <<  8) |
+                         ((D & 0x00000002) <<  7) | ((D & 0x00000001) <<  2) |
+                         ((D & 0x00000200)      ) | ((D & 0x00008000) >>  2) |
+                         ((D & 0x00000088) >>  3) | ((D & 0x00001000) >>  7) |
+                         ((D & 0x00080000) >>  9) | ((D & 0x02020000) >> 14) |
+                         ((D & 0x00400000) >> 21);
+      round_key[2*j+1] = ((C & 0x00000001) << 28) | ((C & 0x00000082) << 18) |
+                         ((C & 0x00002000) << 14) | ((C & 0x00000100) << 10) |
+                         ((C & 0x00001000) <<  9) | ((C & 0x00040000) <<  6) |
+                         ((C & 0x02400000) <<  4) | ((C & 0x00008000) <<  2) |
+                         ((C & 0x00200000) >>  1) | ((C & 0x04000000) >> 10) |
+                         ((D & 0x00000020) <<  6) | ((D & 0x00000100)      ) |
+                         ((D & 0x00000800) >>  1) | ((D & 0x00000040) >>  3) |
+                         ((D & 0x00010000) >>  4) | ((D & 0x00000400) >>  5) |
+                         ((D & 0x00004000) >> 10) | ((D & 0x04000000) >> 13) |
+                         ((D & 0x00800000) >> 14) | ((D & 0x00100000) >> 18) |
+                         ((D & 0x01000000) >> 24) | ((D & 0x08000000) >> 26);
+      }
+   }
+
+/*************************************************
+* TripleDES Encryption                           *
+*************************************************/
+void TripleDES::enc(const byte in[], byte out[]) const
+   {
+   u32bit left  = make_u32bit(in[0], in[1], in[2], in[3]),
+          right = make_u32bit(in[4], in[5], in[6], in[7]);
+   DES::IP(left, right);
+   des1.raw_encrypt(left, right);
+   des2.raw_decrypt(right, left);
+   des3.raw_encrypt(left, right);
+   DES::FP(left, right);
+   out[0] = get_byte(0, right); out[1] = get_byte(1, right);
+   out[2] = get_byte(2, right); out[3] = get_byte(3, right);
+   out[4] = get_byte(0, left);  out[5] = get_byte(1, left);
+   out[6] = get_byte(2, left);  out[7] = get_byte(3, left);
+   }
+
+/*************************************************
+* TripleDES Decryption                           *
+*************************************************/
+void TripleDES::dec(const byte in[], byte out[]) const
+   {
+   u32bit left  = make_u32bit(in[0], in[1], in[2], in[3]),
+          right = make_u32bit(in[4], in[5], in[6], in[7]);
+   DES::IP(left, right);
+   des3.raw_decrypt(left, right);
+   des2.raw_encrypt(right, left);
+   des1.raw_decrypt(left, right);
+   DES::FP(left, right);
+   out[0] = get_byte(0, right); out[1] = get_byte(1, right);
+   out[2] = get_byte(2, right); out[3] = get_byte(3, right);
+   out[4] = get_byte(0, left);  out[5] = get_byte(1, left);
+   out[6] = get_byte(2, left);  out[7] = get_byte(3, left);
+   }
+
+/*************************************************
+* TripleDES Key Schedule                         *
+*************************************************/
+void TripleDES::key(const byte key[], u32bit length)
+   {
+   des1.set_key(key, 8);
+   des2.set_key(key + 8, 8);
+   if(length == 24)
+      des3.set_key(key + 16, 8);
+   else
+      des3.set_key(key, 8);
+   }
+
+/*************************************************
+* DESX Encryption                                *
+*************************************************/
+void DESX::enc(const byte in[], byte out[]) const
+   {
+   xor_buf(out, in, K1.begin(), BLOCK_SIZE);
+   des.encrypt(out);
+   xor_buf(out, K2.begin(), BLOCK_SIZE);
+   }
+
+/*************************************************
+* DESX Decryption                                *
+*************************************************/
+void DESX::dec(const byte in[], byte out[]) const
+   {
+   xor_buf(out, in, K2.begin(), BLOCK_SIZE);
+   des.decrypt(out);
+   xor_buf(out, K1.begin(), BLOCK_SIZE);
+   }
+
+/*************************************************
+* DESX Key Schedule                              *
+*************************************************/
+void DESX::key(const byte key[], u32bit)
+   {
+   K1.copy(key, 8);
+   des.set_key(key + 8, 8);
+   K2.copy(key + 16, 8);
+   }
+
+}
============================================================
--- botan/des.h	769c08188bd776f17a84c887ef1aba7d19e18c63
+++ botan/des.h	769c08188bd776f17a84c887ef1aba7d19e18c63
@@ -0,0 +1,76 @@
+/*************************************************
+* DES Header File                                *
+* (C) 1999-2005 The Botan Project                *
+*************************************************/
+
+#ifndef BOTAN_DES_H__
+#define BOTAN_DES_H__
+
+#include <botan/base.h>
+
+namespace Botan {
+
+/*************************************************
+* DES                                            *
+*************************************************/
+class DES : public BlockCipher
+   {
+   public:
+      void clear() throw() { round_key.clear(); }
+      std::string name() const { return "DES"; }
+      BlockCipher* clone() const { return new DES; }
+      DES() : BlockCipher(8, 8) {}
+   private:
+      friend class TripleDES;
+      void enc(const byte[], byte[]) const;
+      void dec(const byte[], byte[]) const;
+      void key(const byte[], u32bit);
+      void raw_encrypt(u32bit&, u32bit&) const;
+      void raw_decrypt(u32bit&, u32bit&) const;
+      void round(u32bit&, u32bit, u32bit) const;
+      static void IP(u32bit&, u32bit&);
+      static void FP(u32bit&, u32bit&);
+      static const u32bit SPBOX1[256], SPBOX2[256], SPBOX3[256], SPBOX4[256],
+                          SPBOX5[256], SPBOX6[256], SPBOX7[256], SPBOX8[256];
+      static const u64bit IPTAB1[256], IPTAB2[256], FPTAB1[256], FPTAB2[256];
+      SecureBuffer<u32bit, 32> round_key;
+   };
+
+/*************************************************
+* Triple DES                                     *
+*************************************************/
+class TripleDES : public BlockCipher
+   {
+   public:
+      void clear() throw() { des1.clear(); des2.clear(); des3.clear(); }
+      std::string name() const { return "TripleDES"; }
+      BlockCipher* clone() const { return new TripleDES; }
+      TripleDES() : BlockCipher(8, 16, 24, 8) {}
+   private:
+      void enc(const byte[], byte[]) const;
+      void dec(const byte[], byte[]) const;
+      void key(const byte[], u32bit);
+      DES des1, des2, des3;
+   };
+
+/*************************************************
+* DESX                                           *
+*************************************************/
+class DESX : public BlockCipher
+   {
+   public:
+      void clear() throw() { des.clear(); K1.clear(); K2.clear(); }
+      std::string name() const { return "DESX"; }
+      BlockCipher* clone() const { return new DESX; }
+      DESX() : BlockCipher(8, 24) {}
+   private:
+      void enc(const byte[], byte[]) const;
+      void dec(const byte[], byte[]) const;
+      void key(const byte[], u32bit);
+      SecureBuffer<byte, 8> K1, K2;
+      DES des;
+   };
+
+}
+
+#endif
============================================================
--- botan/des_tab.cpp	9ce42b4de43fb7cf599b1bad7c69b0e167543656
+++ botan/des_tab.cpp	9ce42b4de43fb7cf599b1bad7c69b0e167543656
@@ -0,0 +1,634 @@
+/*************************************************
+* Substitution/Permutation Tables for DES        *
+* (C) 1999-2005 The Botan Project                *
+*************************************************/
+
+#include <botan/des.h>
+
+namespace Botan {
+
+const u32bit DES::SPBOX1[256] = {
+0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404,
+0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400,
+0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400,
+0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404,
+0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404,
+0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000,
+0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000,
+0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404,
+0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404,
+0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000,
+0x00010004, 0x00010400, 0x00000000, 0x01010004, 0x01010400, 0x00000000,
+0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000,
+0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004,
+0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400,
+0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004,
+0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000,
+0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000,
+0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004,
+0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004,
+0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400,
+0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400,
+0x00000000, 0x01010004, 0x01010400, 0x00000000, 0x00010000, 0x01010404,
+0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400,
+0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004,
+0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000,
+0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004,
+0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404,
+0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400,
+0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004,
+0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404,
+0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400,
+0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004,
+0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404,
+0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400,
+0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400,
+0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404,
+0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404,
+0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000,
+0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000,
+0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404,
+0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404,
+0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000,
+0x00010004, 0x00010400, 0x00000000, 0x01010004 };
+
+const u32bit DES::SPBOX2[256] = {
+0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020,
+0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000,
+0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020,
+0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000,
+0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000,
+0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000,
+0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000,
+0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000,
+0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020,
+0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020,
+0x80000000, 0x80100020, 0x80108020, 0x00108000, 0x80108020, 0x80008000,
+0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020,
+0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000,
+0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000,
+0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020,
+0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020,
+0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000,
+0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020,
+0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000,
+0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020,
+0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020,
+0x80108020, 0x00108000, 0x80108020, 0x80008000, 0x00008000, 0x00108020,
+0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020,
+0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020,
+0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000,
+0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000,
+0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020,
+0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000,
+0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020,
+0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020,
+0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000,
+0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000,
+0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020,
+0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000,
+0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020,
+0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000,
+0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000,
+0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000,
+0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000,
+0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000,
+0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020,
+0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020,
+0x80000000, 0x80100020, 0x80108020, 0x00108000 };
+
+const u32bit DES::SPBOX3[256] = {
+0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000,
+0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000,
+0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008,
+0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208,
+0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208,
+0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208,
+0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008,
+0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008,
+0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208,
+0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000,
+0x00020208, 0x00000008, 0x08020008, 0x00020200, 0x00000208, 0x08020200,
+0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200,
+0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008,
+0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200,
+0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200,
+0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000,
+0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200,
+0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200,
+0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000,
+0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008,
+0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008,
+0x08020008, 0x00020200, 0x00000208, 0x08020200, 0x00000000, 0x08020008,
+0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008,
+0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208,
+0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000,
+0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208,
+0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000,
+0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000,
+0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200,
+0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208,
+0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208,
+0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200,
+0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000,
+0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000,
+0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008,
+0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208,
+0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208,
+0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208,
+0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008,
+0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008,
+0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208,
+0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000,
+0x00020208, 0x00000008, 0x08020008, 0x00020200 };
+
+const u32bit DES::SPBOX4[256] = {
+0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081,
+0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081,
+0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000,
+0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080,
+0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080,
+0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081,
+0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080,
+0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080,
+0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001,
+0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001,
+0x00000080, 0x00800000, 0x00002000, 0x00802080, 0x00802001, 0x00002081,
+0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001,
+0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000,
+0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001,
+0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001,
+0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081,
+0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000,
+0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001,
+0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081,
+0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081,
+0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000,
+0x00002000, 0x00802080, 0x00802001, 0x00002081, 0x00002081, 0x00000080,
+0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000,
+0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001,
+0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000,
+0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080,
+0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001,
+0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000,
+0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081,
+0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000,
+0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080,
+0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080,
+0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081,
+0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081,
+0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000,
+0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080,
+0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080,
+0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081,
+0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080,
+0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080,
+0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001,
+0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001,
+0x00000080, 0x00800000, 0x00002000, 0x00802080 };
+
+const u32bit DES::SPBOX5[256] = {
+0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100,
+0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100,
+0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000,
+0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100,
+0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000,
+0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000,
+0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000,
+0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000,
+0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000,
+0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000,
+0x00000000, 0x40080000, 0x02080100, 0x40000100, 0x00000100, 0x02080100,
+0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000,
+0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000,
+0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000,
+0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100,
+0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100,
+0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000,
+0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100,
+0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100,
+0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000,
+0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000,
+0x02080100, 0x40000100, 0x00000100, 0x02080100, 0x02080000, 0x42000100,
+0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000,
+0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000,
+0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100,
+0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000,
+0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100,
+0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100,
+0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100,
+0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100,
+0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100,
+0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100,
+0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100,
+0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100,
+0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000,
+0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100,
+0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000,
+0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000,
+0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000,
+0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000,
+0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000,
+0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000,
+0x00000000, 0x40080000, 0x02080100, 0x40000100 };
+
+const u32bit DES::SPBOX6[256] = {
+0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010,
+0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010,
+0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010,
+0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010,
+0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000,
+0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000,
+0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000,
+0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000,
+0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000,
+0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000,
+0x20404000, 0x20000000, 0x00400010, 0x20004010, 0x20000010, 0x20400000,
+0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000,
+0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000,
+0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000,
+0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000,
+0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000,
+0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000,
+0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010,
+0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000,
+0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010,
+0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000,
+0x00400010, 0x20004010, 0x20000010, 0x20400000, 0x00004000, 0x20404010,
+0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010,
+0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010,
+0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010,
+0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000,
+0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010,
+0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010,
+0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010,
+0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010,
+0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010,
+0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010,
+0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010,
+0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010,
+0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010,
+0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010,
+0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000,
+0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000,
+0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000,
+0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000,
+0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000,
+0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000,
+0x20404000, 0x20000000, 0x00400010, 0x20004010 };
+
+const u32bit DES::SPBOX7[256] = {
+0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802,
+0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002,
+0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802,
+0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002,
+0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002,
+0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802,
+0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000,
+0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800,
+0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000,
+0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800,
+0x04000002, 0x04000800, 0x00000800, 0x00200002, 0x00200000, 0x04200002,
+0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800,
+0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000,
+0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800,
+0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800,
+0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800,
+0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002,
+0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000,
+0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002,
+0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802,
+0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800,
+0x00000800, 0x00200002, 0x00200000, 0x04200002, 0x04000802, 0x00000000,
+0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000,
+0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802,
+0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000,
+0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802,
+0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800,
+0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002,
+0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802,
+0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000,
+0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802,
+0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002,
+0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802,
+0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002,
+0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802,
+0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002,
+0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002,
+0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802,
+0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000,
+0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800,
+0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000,
+0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800,
+0x04000002, 0x04000800, 0x00000800, 0x00200002 };
+
+const u32bit DES::SPBOX8[256] = {
+0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040,
+0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000,
+0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040,
+0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000,
+0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000,
+0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000,
+0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040,
+0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040,
+0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000,
+0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040,
+0x00001040, 0x00040040, 0x10000000, 0x10041000, 0x10001040, 0x00001000,
+0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000,
+0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040,
+0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040,
+0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000,
+0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000,
+0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040,
+0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000,
+0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040,
+0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000,
+0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040,
+0x10000000, 0x10041000, 0x10001040, 0x00001000, 0x00040000, 0x10041040,
+0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000,
+0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040,
+0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040,
+0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040,
+0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000,
+0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040,
+0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000,
+0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040,
+0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000,
+0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000,
+0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040,
+0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000,
+0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040,
+0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000,
+0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000,
+0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000,
+0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040,
+0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040,
+0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000,
+0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040,
+0x00001040, 0x00040040, 0x10000000, 0x10041000 };
+
+const u64bit DES::IPTAB1[256] = {
+0x0000000000000000ULL, 0x0000000200000000ULL, 0x0000000000000002ULL, 0x0000000200000002ULL,
+0x0000020000000000ULL, 0x0000020200000000ULL, 0x0000020000000002ULL, 0x0000020200000002ULL,
+0x0000000000000200ULL, 0x0000000200000200ULL, 0x0000000000000202ULL, 0x0000000200000202ULL,
+0x0000020000000200ULL, 0x0000020200000200ULL, 0x0000020000000202ULL, 0x0000020200000202ULL,
+0x0002000000000000ULL, 0x0002000200000000ULL, 0x0002000000000002ULL, 0x0002000200000002ULL,
+0x0002020000000000ULL, 0x0002020200000000ULL, 0x0002020000000002ULL, 0x0002020200000002ULL,
+0x0002000000000200ULL, 0x0002000200000200ULL, 0x0002000000000202ULL, 0x0002000200000202ULL,
+0x0002020000000200ULL, 0x0002020200000200ULL, 0x0002020000000202ULL, 0x0002020200000202ULL,
+0x0000000000020000ULL, 0x0000000200020000ULL, 0x0000000000020002ULL, 0x0000000200020002ULL,
+0x0000020000020000ULL, 0x0000020200020000ULL, 0x0000020000020002ULL, 0x0000020200020002ULL,
+0x0000000000020200ULL, 0x0000000200020200ULL, 0x0000000000020202ULL, 0x0000000200020202ULL,
+0x0000020000020200ULL, 0x0000020200020200ULL, 0x0000020000020202ULL, 0x0000020200020202ULL,
+0x0002000000020000ULL, 0x0002000200020000ULL, 0x0002000000020002ULL, 0x0002000200020002ULL,
+0x0002020000020000ULL, 0x0002020200020000ULL, 0x0002020000020002ULL, 0x0002020200020002ULL,
+0x0002000000020200ULL, 0x0002000200020200ULL, 0x0002000000020202ULL, 0x0002000200020202ULL,
+0x0002020000020200ULL, 0x0002020200020200ULL, 0x0002020000020202ULL, 0x0002020200020202ULL,
+0x0200000000000000ULL, 0x0200000200000000ULL, 0x0200000000000002ULL, 0x0200000200000002ULL,
+0x0200020000000000ULL, 0x0200020200000000ULL, 0x0200020000000002ULL, 0x0200020200000002ULL,
+0x0200000000000200ULL, 0x0200000200000200ULL, 0x0200000000000202ULL, 0x0200000200000202ULL,
+0x0200020000000200ULL, 0x0200020200000200ULL, 0x0200020000000202ULL, 0x0200020200000202ULL,
+0x0202000000000000ULL, 0x0202000200000000ULL, 0x0202000000000002ULL, 0x0202000200000002ULL,
+0x0202020000000000ULL, 0x0202020200000000ULL, 0x0202020000000002ULL, 0x0202020200000002ULL,
+0x0202000000000200ULL, 0x0202000200000200ULL, 0x0202000000000202ULL, 0x0202000200000202ULL,
+0x0202020000000200ULL, 0x0202020200000200ULL, 0x0202020000000202ULL, 0x0202020200000202ULL,
+0x0200000000020000ULL, 0x0200000200020000ULL, 0x0200000000020002ULL, 0x0200000200020002ULL,
+0x0200020000020000ULL, 0x0200020200020000ULL, 0x0200020000020002ULL, 0x0200020200020002ULL,
+0x0200000000020200ULL, 0x0200000200020200ULL, 0x0200000000020202ULL, 0x0200000200020202ULL,
+0x0200020000020200ULL, 0x0200020200020200ULL, 0x0200020000020202ULL, 0x0200020200020202ULL,
+0x0202000000020000ULL, 0x0202000200020000ULL, 0x0202000000020002ULL, 0x0202000200020002ULL,
+0x0202020000020000ULL, 0x0202020200020000ULL, 0x0202020000020002ULL, 0x0202020200020002ULL,
+0x0202000000020200ULL, 0x0202000200020200ULL, 0x0202000000020202ULL, 0x0202000200020202ULL,
+0x0202020000020200ULL, 0x0202020200020200ULL, 0x0202020000020202ULL, 0x0202020200020202ULL,
+0x0000000002000000ULL, 0x0000000202000000ULL, 0x0000000002000002ULL, 0x0000000202000002ULL,
+0x0000020002000000ULL, 0x0000020202000000ULL, 0x0000020002000002ULL, 0x0000020202000002ULL,
+0x0000000002000200ULL, 0x0000000202000200ULL, 0x0000000002000202ULL, 0x0000000202000202ULL,
+0x0000020002000200ULL, 0x0000020202000200ULL, 0x0000020002000202ULL, 0x0000020202000202ULL,
+0x0002000002000000ULL, 0x0002000202000000ULL, 0x0002000002000002ULL, 0x0002000202000002ULL,
+0x0002020002000000ULL, 0x0002020202000000ULL, 0x0002020002000002ULL, 0x0002020202000002ULL,
+0x0002000002000200ULL, 0x0002000202000200ULL, 0x0002000002000202ULL, 0x0002000202000202ULL,
+0x0002020002000200ULL, 0x0002020202000200ULL, 0x0002020002000202ULL, 0x0002020202000202ULL,
+0x0000000002020000ULL, 0x0000000202020000ULL, 0x0000000002020002ULL, 0x0000000202020002ULL,
+0x0000020002020000ULL, 0x0000020202020000ULL, 0x0000020002020002ULL, 0x0000020202020002ULL,
+0x0000000002020200ULL, 0x0000000202020200ULL, 0x0000000002020202ULL, 0x0000000202020202ULL,
+0x0000020002020200ULL, 0x0000020202020200ULL, 0x0000020002020202ULL, 0x0000020202020202ULL,
+0x0002000002020000ULL, 0x0002000202020000ULL, 0x0002000002020002ULL, 0x0002000202020002ULL,
+0x0002020002020000ULL, 0x0002020202020000ULL, 0x0002020002020002ULL, 0x0002020202020002ULL,
+0x0002000002020200ULL, 0x0002000202020200ULL, 0x0002000002020202ULL, 0x0002000202020202ULL,
+0x0002020002020200ULL, 0x0002020202020200ULL, 0x0002020002020202ULL, 0x0002020202020202ULL,
+0x0200000002000000ULL, 0x0200000202000000ULL, 0x0200000002000002ULL, 0x0200000202000002ULL,
+0x0200020002000000ULL, 0x0200020202000000ULL, 0x0200020002000002ULL, 0x0200020202000002ULL,
+0x0200000002000200ULL, 0x0200000202000200ULL, 0x0200000002000202ULL, 0x0200000202000202ULL,
+0x0200020002000200ULL, 0x0200020202000200ULL, 0x0200020002000202ULL, 0x0200020202000202ULL,
+0x0202000002000000ULL, 0x0202000202000000ULL, 0x0202000002000002ULL, 0x0202000202000002ULL,
+0x0202020002000000ULL, 0x0202020202000000ULL, 0x0202020002000002ULL, 0x0202020202000002ULL,
+0x0202000002000200ULL, 0x0202000202000200ULL, 0x0202000002000202ULL, 0x0202000202000202ULL,
+0x0202020002000200ULL, 0x0202020202000200ULL, 0x0202020002000202ULL, 0x0202020202000202ULL,
+0x0200000002020000ULL, 0x0200000202020000ULL, 0x0200000002020002ULL, 0x0200000202020002ULL,
+0x0200020002020000ULL, 0x0200020202020000ULL, 0x0200020002020002ULL, 0x0200020202020002ULL,
+0x0200000002020200ULL, 0x0200000202020200ULL, 0x0200000002020202ULL, 0x0200000202020202ULL,
+0x0200020002020200ULL, 0x0200020202020200ULL, 0x0200020002020202ULL, 0x0200020202020202ULL,
+0x0202000002020000ULL, 0x0202000202020000ULL, 0x0202000002020002ULL, 0x0202000202020002ULL,
+0x0202020002020000ULL, 0x0202020202020000ULL, 0x0202020002020002ULL, 0x0202020202020002ULL,
+0x0202000002020200ULL, 0x0202000202020200ULL, 0x0202000002020202ULL, 0x0202000202020202ULL,
+0x0202020002020200ULL, 0x0202020202020200ULL, 0x0202020002020202ULL, 0x0202020202020202ULL };
+
+const u64bit DES::IPTAB2[256] = {
+0x0000000000000000ULL, 0x0000010000000000ULL, 0x0000000000000100ULL, 0x0000010000000100ULL,
+0x0001000000000000ULL, 0x0001010000000000ULL, 0x0001000000000100ULL, 0x0001010000000100ULL,
+0x0000000000010000ULL, 0x0000010000010000ULL, 0x0000000000010100ULL, 0x0000010000010100ULL,
+0x0001000000010000ULL, 0x0001010000010000ULL, 0x0001000000010100ULL, 0x0001010000010100ULL,
+0x0100000000000000ULL, 0x0100010000000000ULL, 0x0100000000000100ULL, 0x0100010000000100ULL,
+0x0101000000000000ULL, 0x0101010000000000ULL, 0x0101000000000100ULL, 0x0101010000000100ULL,
+0x0100000000010000ULL, 0x0100010000010000ULL, 0x0100000000010100ULL, 0x0100010000010100ULL,
+0x0101000000010000ULL, 0x0101010000010000ULL, 0x0101000000010100ULL, 0x0101010000010100ULL,
+0x0000000001000000ULL, 0x0000010001000000ULL, 0x0000000001000100ULL, 0x0000010001000100ULL,
+0x0001000001000000ULL, 0x0001010001000000ULL, 0x0001000001000100ULL, 0x0001010001000100ULL,
+0x0000000001010000ULL, 0x0000010001010000ULL, 0x0000000001010100ULL, 0x0000010001010100ULL,
+0x0001000001010000ULL, 0x0001010001010000ULL, 0x0001000001010100ULL, 0x0001010001010100ULL,
+0x0100000001000000ULL, 0x0100010001000000ULL, 0x0100000001000100ULL, 0x0100010001000100ULL,
+0x0101000001000000ULL, 0x0101010001000000ULL, 0x0101000001000100ULL, 0x0101010001000100ULL,
+0x0100000001010000ULL, 0x0100010001010000ULL, 0x0100000001010100ULL, 0x0100010001010100ULL,
+0x0101000001010000ULL, 0x0101010001010000ULL, 0x0101000001010100ULL, 0x0101010001010100ULL,
+0x0000000100000000ULL, 0x0000010100000000ULL, 0x0000000100000100ULL, 0x0000010100000100ULL,
+0x0001000100000000ULL, 0x0001010100000000ULL, 0x0001000100000100ULL, 0x0001010100000100ULL,
+0x0000000100010000ULL, 0x0000010100010000ULL, 0x0000000100010100ULL, 0x0000010100010100ULL,
+0x0001000100010000ULL, 0x0001010100010000ULL, 0x0001000100010100ULL, 0x0001010100010100ULL,
+0x0100000100000000ULL, 0x0100010100000000ULL, 0x0100000100000100ULL, 0x0100010100000100ULL,
+0x0101000100000000ULL, 0x0101010100000000ULL, 0x0101000100000100ULL, 0x0101010100000100ULL,
+0x0100000100010000ULL, 0x0100010100010000ULL, 0x0100000100010100ULL, 0x0100010100010100ULL,
+0x0101000100010000ULL, 0x0101010100010000ULL, 0x0101000100010100ULL, 0x0101010100010100ULL,
+0x0000000101000000ULL, 0x0000010101000000ULL, 0x0000000101000100ULL, 0x0000010101000100ULL,
+0x0001000101000000ULL, 0x0001010101000000ULL, 0x0001000101000100ULL, 0x0001010101000100ULL,
+0x0000000101010000ULL, 0x0000010101010000ULL, 0x0000000101010100ULL, 0x0000010101010100ULL,
+0x0001000101010000ULL, 0x0001010101010000ULL, 0x0001000101010100ULL, 0x0001010101010100ULL,
+0x0100000101000000ULL, 0x0100010101000000ULL, 0x0100000101000100ULL, 0x0100010101000100ULL,
+0x0101000101000000ULL, 0x0101010101000000ULL, 0x0101000101000100ULL, 0x0101010101000100ULL,
+0x0100000101010000ULL, 0x0100010101010000ULL, 0x0100000101010100ULL, 0x0100010101010100ULL,
+0x0101000101010000ULL, 0x0101010101010000ULL, 0x0101000101010100ULL, 0x0101010101010100ULL,
+0x0000000000000001ULL, 0x0000010000000001ULL, 0x0000000000000101ULL, 0x0000010000000101ULL,
+0x0001000000000001ULL, 0x0001010000000001ULL, 0x0001000000000101ULL, 0x0001010000000101ULL,
+0x0000000000010001ULL, 0x0000010000010001ULL, 0x0000000000010101ULL, 0x0000010000010101ULL,
+0x0001000000010001ULL, 0x0001010000010001ULL, 0x0001000000010101ULL, 0x0001010000010101ULL,
+0x0100000000000001ULL, 0x0100010000000001ULL, 0x0100000000000101ULL, 0x0100010000000101ULL,
+0x0101000000000001ULL, 0x0101010000000001ULL, 0x0101000000000101ULL, 0x0101010000000101ULL,
+0x0100000000010001ULL, 0x0100010000010001ULL, 0x0100000000010101ULL, 0x0100010000010101ULL,
+0x0101000000010001ULL, 0x0101010000010001ULL, 0x0101000000010101ULL, 0x0101010000010101ULL,
+0x0000000001000001ULL, 0x0000010001000001ULL, 0x0000000001000101ULL, 0x0000010001000101ULL,
+0x0001000001000001ULL, 0x0001010001000001ULL, 0x0001000001000101ULL, 0x0001010001000101ULL,
+0x0000000001010001ULL, 0x0000010001010001ULL, 0x0000000001010101ULL, 0x0000010001010101ULL,
+0x0001000001010001ULL, 0x0001010001010001ULL, 0x0001000001010101ULL, 0x0001010001010101ULL,
+0x0100000001000001ULL, 0x0100010001000001ULL, 0x0100000001000101ULL, 0x0100010001000101ULL,
+0x0101000001000001ULL, 0x0101010001000001ULL, 0x0101000001000101ULL, 0x0101010001000101ULL,
+0x0100000001010001ULL, 0x0100010001010001ULL, 0x0100000001010101ULL, 0x0100010001010101ULL,
+0x0101000001010001ULL, 0x0101010001010001ULL, 0x0101000001010101ULL, 0x0101010001010101ULL,
+0x0000000100000001ULL, 0x0000010100000001ULL, 0x0000000100000101ULL, 0x0000010100000101ULL,
+0x0001000100000001ULL, 0x0001010100000001ULL, 0x0001000100000101ULL, 0x0001010100000101ULL,
+0x0000000100010001ULL, 0x0000010100010001ULL, 0x0000000100010101ULL, 0x0000010100010101ULL,
+0x0001000100010001ULL, 0x0001010100010001ULL, 0x0001000100010101ULL, 0x0001010100010101ULL,
+0x0100000100000001ULL, 0x0100010100000001ULL, 0x0100000100000101ULL, 0x0100010100000101ULL,
+0x0101000100000001ULL, 0x0101010100000001ULL, 0x0101000100000101ULL, 0x0101010100000101ULL,
+0x0100000100010001ULL, 0x0100010100010001ULL, 0x0100000100010101ULL, 0x0100010100010101ULL,
+0x0101000100010001ULL, 0x0101010100010001ULL, 0x0101000100010101ULL, 0x0101010100010101ULL,
+0x0000000101000001ULL, 0x0000010101000001ULL, 0x0000000101000101ULL, 0x0000010101000101ULL,
+0x0001000101000001ULL, 0x0001010101000001ULL, 0x0001000101000101ULL, 0x0001010101000101ULL,
+0x0000000101010001ULL, 0x0000010101010001ULL, 0x0000000101010101ULL, 0x0000010101010101ULL,
+0x0001000101010001ULL, 0x0001010101010001ULL, 0x0001000101010101ULL, 0x0001010101010101ULL,
+0x0100000101000001ULL, 0x0100010101000001ULL, 0x0100000101000101ULL, 0x0100010101000101ULL,
+0x0101000101000001ULL, 0x0101010101000001ULL, 0x0101000101000101ULL, 0x0101010101000101ULL,
+0x0100000101010001ULL, 0x0100010101010001ULL, 0x0100000101010101ULL, 0x0100010101010101ULL,
+0x0101000101010001ULL, 0x0101010101010001ULL, 0x0101000101010101ULL, 0x0101010101010101ULL };
+
+const u64bit DES::FPTAB1[256] = {
+0x0000000000000000ULL, 0x0000000100000000ULL, 0x0000000004000000ULL, 0x0000000104000000ULL,
+0x0000000000040000ULL, 0x0000000100040000ULL, 0x0000000004040000ULL, 0x0000000104040000ULL,
+0x0000000000000400ULL, 0x0000000100000400ULL, 0x0000000004000400ULL, 0x0000000104000400ULL,
+0x0000000000040400ULL, 0x0000000100040400ULL, 0x0000000004040400ULL, 0x0000000104040400ULL,
+0x0000000000000004ULL, 0x0000000100000004ULL, 0x0000000004000004ULL, 0x0000000104000004ULL,
+0x0000000000040004ULL, 0x0000000100040004ULL, 0x0000000004040004ULL, 0x0000000104040004ULL,
+0x0000000000000404ULL, 0x0000000100000404ULL, 0x0000000004000404ULL, 0x0000000104000404ULL,
+0x0000000000040404ULL, 0x0000000100040404ULL, 0x0000000004040404ULL, 0x0000000104040404ULL,
+0x0400000000000000ULL, 0x0400000100000000ULL, 0x0400000004000000ULL, 0x0400000104000000ULL,
+0x0400000000040000ULL, 0x0400000100040000ULL, 0x0400000004040000ULL, 0x0400000104040000ULL,
+0x0400000000000400ULL, 0x0400000100000400ULL, 0x0400000004000400ULL, 0x0400000104000400ULL,
+0x0400000000040400ULL, 0x0400000100040400ULL, 0x0400000004040400ULL, 0x0400000104040400ULL,
+0x0400000000000004ULL, 0x0400000100000004ULL, 0x0400000004000004ULL, 0x0400000104000004ULL,
+0x0400000000040004ULL, 0x0400000100040004ULL, 0x0400000004040004ULL, 0x0400000104040004ULL,
+0x0400000000000404ULL, 0x0400000100000404ULL, 0x0400000004000404ULL, 0x0400000104000404ULL,
+0x0400000000040404ULL, 0x0400000100040404ULL, 0x0400000004040404ULL, 0x0400000104040404ULL,
+0x0004000000000000ULL, 0x0004000100000000ULL, 0x0004000004000000ULL, 0x0004000104000000ULL,
+0x0004000000040000ULL, 0x0004000100040000ULL, 0x0004000004040000ULL, 0x0004000104040000ULL,
+0x0004000000000400ULL, 0x0004000100000400ULL, 0x0004000004000400ULL, 0x0004000104000400ULL,
+0x0004000000040400ULL, 0x0004000100040400ULL, 0x0004000004040400ULL, 0x0004000104040400ULL,
+0x0004000000000004ULL, 0x0004000100000004ULL, 0x0004000004000004ULL, 0x0004000104000004ULL,
+0x0004000000040004ULL, 0x0004000100040004ULL, 0x0004000004040004ULL, 0x0004000104040004ULL,
+0x0004000000000404ULL, 0x0004000100000404ULL, 0x0004000004000404ULL, 0x0004000104000404ULL,
+0x0004000000040404ULL, 0x0004000100040404ULL, 0x0004000004040404ULL, 0x0004000104040404ULL,
+0x0404000000000000ULL, 0x0404000100000000ULL, 0x0404000004000000ULL, 0x0404000104000000ULL,
+0x0404000000040000ULL, 0x0404000100040000ULL, 0x0404000004040000ULL, 0x0404000104040000ULL,
+0x0404000000000400ULL, 0x0404000100000400ULL, 0x0404000004000400ULL, 0x0404000104000400ULL,
+0x0404000000040400ULL, 0x0404000100040400ULL, 0x0404000004040400ULL, 0x0404000104040400ULL,
+0x0404000000000004ULL, 0x0404000100000004ULL, 0x0404000004000004ULL, 0x0404000104000004ULL,
+0x0404000000040004ULL, 0x0404000100040004ULL, 0x0404000004040004ULL, 0x0404000104040004ULL,
+0x0404000000000404ULL, 0x0404000100000404ULL, 0x0404000004000404ULL, 0x0404000104000404ULL,
+0x0404000000040404ULL, 0x0404000100040404ULL, 0x0404000004040404ULL, 0x0404000104040404ULL,
+0x0000040000000000ULL, 0x0000040100000000ULL, 0x0000040004000000ULL, 0x0000040104000000ULL,
+0x0000040000040000ULL, 0x0000040100040000ULL, 0x0000040004040000ULL, 0x0000040104040000ULL,
+0x0000040000000400ULL, 0x0000040100000400ULL, 0x0000040004000400ULL, 0x0000040104000400ULL,
+0x0000040000040400ULL, 0x0000040100040400ULL, 0x0000040004040400ULL, 0x0000040104040400ULL,
+0x0000040000000004ULL, 0x0000040100000004ULL, 0x0000040004000004ULL, 0x0000040104000004ULL,
+0x0000040000040004ULL, 0x0000040100040004ULL, 0x0000040004040004ULL, 0x0000040104040004ULL,
+0x0000040000000404ULL, 0x0000040100000404ULL, 0x0000040004000404ULL, 0x0000040104000404ULL,
+0x0000040000040404ULL, 0x0000040100040404ULL, 0x0000040004040404ULL, 0x0000040104040404ULL,
+0x0400040000000000ULL, 0x0400040100000000ULL, 0x0400040004000000ULL, 0x0400040104000000ULL,
+0x0400040000040000ULL, 0x0400040100040000ULL, 0x0400040004040000ULL, 0x0400040104040000ULL,
+0x0400040000000400ULL, 0x0400040100000400ULL, 0x0400040004000400ULL, 0x0400040104000400ULL,
+0x0400040000040400ULL, 0x0400040100040400ULL, 0x0400040004040400ULL, 0x0400040104040400ULL,
+0x0400040000000004ULL, 0x0400040100000004ULL, 0x0400040004000004ULL, 0x0400040104000004ULL,
+0x0400040000040004ULL, 0x0400040100040004ULL, 0x0400040004040004ULL, 0x0400040104040004ULL,
+0x0400040000000404ULL, 0x0400040100000404ULL, 0x0400040004000404ULL, 0x0400040104000404ULL,
+0x0400040000040404ULL, 0x0400040100040404ULL, 0x0400040004040404ULL, 0x0400040104040404ULL,
+0x0004040000000000ULL, 0x0004040100000000ULL, 0x0004040004000000ULL, 0x0004040104000000ULL,
+0x0004040000040000ULL, 0x0004040100040000ULL, 0x0004040004040000ULL, 0x0004040104040000ULL,
+0x0004040000000400ULL, 0x0004040100000400ULL, 0x0004040004000400ULL, 0x0004040104000400ULL,
+0x0004040000040400ULL, 0x0004040100040400ULL, 0x0004040004040400ULL, 0x0004040104040400ULL,
+0x0004040000000004ULL, 0x0004040100000004ULL, 0x0004040004000004ULL, 0x0004040104000004ULL,
+0x0004040000040004ULL, 0x0004040100040004ULL, 0x0004040004040004ULL, 0x0004040104040004ULL,
+0x0004040000000404ULL, 0x0004040100000404ULL, 0x0004040004000404ULL, 0x0004040104000404ULL,
+0x0004040000040404ULL, 0x0004040100040404ULL, 0x0004040004040404ULL, 0x0004040104040404ULL,
+0x0404040000000000ULL, 0x0404040100000000ULL, 0x0404040004000000ULL, 0x0404040104000000ULL,
+0x0404040000040000ULL, 0x0404040100040000ULL, 0x0404040004040000ULL, 0x0404040104040000ULL,
+0x0404040000000400ULL, 0x0404040100000400ULL, 0x0404040004000400ULL, 0x0404040104000400ULL,
+0x0404040000040400ULL, 0x0404040100040400ULL, 0x0404040004040400ULL, 0x0404040104040400ULL,
+0x0404040000000004ULL, 0x0404040100000004ULL, 0x0404040004000004ULL, 0x0404040104000004ULL,
+0x0404040000040004ULL, 0x0404040100040004ULL, 0x0404040004040004ULL, 0x0404040104040004ULL,
+0x0404040000000404ULL, 0x0404040100000404ULL, 0x0404040004000404ULL, 0x0404040104000404ULL,
+0x0404040000040404ULL, 0x0404040100040404ULL, 0x0404040004040404ULL, 0x0404040104040404ULL };
+
+const u64bit DES::FPTAB2[256] = {
+0x0000000000000000ULL, 0x0000004000000000ULL, 0x0000000001000000ULL, 0x0000004001000000ULL,
+0x0000000000010000ULL, 0x0000004000010000ULL, 0x0000000001010000ULL, 0x0000004001010000ULL,
+0x0000000000000100ULL, 0x0000004000000100ULL, 0x0000000001000100ULL, 0x0000004001000100ULL,
+0x0000000000010100ULL, 0x0000004000010100ULL, 0x0000000001010100ULL, 0x0000004001010100ULL,
+0x0000000000000001ULL, 0x0000004000000001ULL, 0x0000000001000001ULL, 0x0000004001000001ULL,
+0x0000000000010001ULL, 0x0000004000010001ULL, 0x0000000001010001ULL, 0x0000004001010001ULL,
+0x0000000000000101ULL, 0x0000004000000101ULL, 0x0000000001000101ULL, 0x0000004001000101ULL,
+0x0000000000010101ULL, 0x0000004000010101ULL, 0x0000000001010101ULL, 0x0000004001010101ULL,
+0x0100000000000000ULL, 0x0100004000000000ULL, 0x0100000001000000ULL, 0x0100004001000000ULL,
+0x0100000000010000ULL, 0x0100004000010000ULL, 0x0100000001010000ULL, 0x0100004001010000ULL,
+0x0100000000000100ULL, 0x0100004000000100ULL, 0x0100000001000100ULL, 0x0100004001000100ULL,
+0x0100000000010100ULL, 0x0100004000010100ULL, 0x0100000001010100ULL, 0x0100004001010100ULL,
+0x0100000000000001ULL, 0x0100004000000001ULL, 0x0100000001000001ULL, 0x0100004001000001ULL,
+0x0100000000010001ULL, 0x0100004000010001ULL, 0x0100000001010001ULL, 0x0100004001010001ULL,
+0x0100000000000101ULL, 0x0100004000000101ULL, 0x0100000001000101ULL, 0x0100004001000101ULL,
+0x0100000000010101ULL, 0x0100004000010101ULL, 0x0100000001010101ULL, 0x0100004001010101ULL,
+0x0001000000000000ULL, 0x0001004000000000ULL, 0x0001000001000000ULL, 0x0001004001000000ULL,
+0x0001000000010000ULL, 0x0001004000010000ULL, 0x0001000001010000ULL, 0x0001004001010000ULL,
+0x0001000000000100ULL, 0x0001004000000100ULL, 0x0001000001000100ULL, 0x0001004001000100ULL,
+0x0001000000010100ULL, 0x0001004000010100ULL, 0x0001000001010100ULL, 0x0001004001010100ULL,
+0x0001000000000001ULL, 0x0001004000000001ULL, 0x0001000001000001ULL, 0x0001004001000001ULL,
+0x0001000000010001ULL, 0x0001004000010001ULL, 0x0001000001010001ULL, 0x0001004001010001ULL,
+0x0001000000000101ULL, 0x0001004000000101ULL, 0x0001000001000101ULL, 0x0001004001000101ULL,
+0x0001000000010101ULL, 0x0001004000010101ULL, 0x0001000001010101ULL, 0x0001004001010101ULL,
+0x0101000000000000ULL, 0x0101004000000000ULL, 0x0101000001000000ULL, 0x0101004001000000ULL,
+0x0101000000010000ULL, 0x0101004000010000ULL, 0x0101000001010000ULL, 0x0101004001010000ULL,
+0x0101000000000100ULL, 0x0101004000000100ULL, 0x0101000001000100ULL, 0x0101004001000100ULL,
+0x0101000000010100ULL, 0x0101004000010100ULL, 0x0101000001010100ULL, 0x0101004001010100ULL,
+0x0101000000000001ULL, 0x0101004000000001ULL, 0x0101000001000001ULL, 0x0101004001000001ULL,
+0x0101000000010001ULL, 0x0101004000010001ULL, 0x0101000001010001ULL, 0x0101004001010001ULL,
+0x0101000000000101ULL, 0x0101004000000101ULL, 0x0101000001000101ULL, 0x0101004001000101ULL,
+0x0101000000010101ULL, 0x0101004000010101ULL, 0x0101000001010101ULL, 0x0101004001010101ULL,
+0x0000010000000000ULL, 0x0000014000000000ULL, 0x0000010001000000ULL, 0x0000014001000000ULL,
+0x0000010000010000ULL, 0x0000014000010000ULL, 0x0000010001010000ULL, 0x0000014001010000ULL,
+0x0000010000000100ULL, 0x0000014000000100ULL, 0x0000010001000100ULL, 0x0000014001000100ULL,
+0x0000010000010100ULL, 0x0000014000010100ULL, 0x0000010001010100ULL, 0x0000014001010100ULL,
+0x0000010000000001ULL, 0x0000014000000001ULL, 0x0000010001000001ULL, 0x0000014001000001ULL,
+0x0000010000010001ULL, 0x0000014000010001ULL, 0x0000010001010001ULL, 0x0000014001010001ULL,
+0x0000010000000101ULL, 0x0000014000000101ULL, 0x0000010001000101ULL, 0x0000014001000101ULL,
+0x0000010000010101ULL, 0x0000014000010101ULL, 0x0000010001010101ULL, 0x0000014001010101ULL,
+0x0100010000000000ULL, 0x0100014000000000ULL, 0x0100010001000000ULL, 0x0100014001000000ULL,
+0x0100010000010000ULL, 0x0100014000010000ULL, 0x0100010001010000ULL, 0x0100014001010000ULL,
+0x0100010000000100ULL, 0x0100014000000100ULL, 0x0100010001000100ULL, 0x0100014001000100ULL,
+0x0100010000010100ULL, 0x0100014000010100ULL, 0x0100010001010100ULL, 0x0100014001010100ULL,
+0x0100010000000001ULL, 0x0100014000000001ULL, 0x0100010001000001ULL, 0x0100014001000001ULL,
+0x0100010000010001ULL, 0x0100014000010001ULL, 0x0100010001010001ULL, 0x0100014001010001ULL,
+0x0100010000000101ULL, 0x0100014000000101ULL, 0x0100010001000101ULL, 0x0100014001000101ULL,
+0x0100010000010101ULL, 0x0100014000010101ULL, 0x0100010001010101ULL, 0x0100014001010101ULL,
+0x0001010000000000ULL, 0x0001014000000000ULL, 0x0001010001000000ULL, 0x0001014001000000ULL,
+0x0001010000010000ULL, 0x0001014000010000ULL, 0x0001010001010000ULL, 0x0001014001010000ULL,
+0x0001010000000100ULL, 0x0001014000000100ULL, 0x0001010001000100ULL, 0x0001014001000100ULL,
+0x0001010000010100ULL, 0x0001014000010100ULL, 0x0001010001010100ULL, 0x0001014001010100ULL,
+0x0001010000000001ULL, 0x0001014000000001ULL, 0x0001010001000001ULL, 0x0001014001000001ULL,
+0x0001010000010001ULL, 0x0001014000010001ULL, 0x0001010001010001ULL, 0x0001014001010001ULL,
+0x0001010000000101ULL, 0x0001014000000101ULL, 0x0001010001000101ULL, 0x0001014001000101ULL,
+0x0001010000010101ULL, 0x0001014000010101ULL, 0x0001010001010101ULL, 0x0001014001010101ULL,
+0x0101010000000000ULL, 0x0101014000000000ULL, 0x0101010001000000ULL, 0x0101014001000000ULL,
+0x0101010000010000ULL, 0x0101014000010000ULL, 0x0101010001010000ULL, 0x0101014001010000ULL,
+0x0101010000000100ULL, 0x0101014000000100ULL, 0x0101010001000100ULL, 0x0101014001000100ULL,
+0x0101010000010100ULL, 0x0101014000010100ULL, 0x0101010001010100ULL, 0x0101014001010100ULL,
+0x0101010000000001ULL, 0x0101014000000001ULL, 0x0101010001000001ULL, 0x0101014001000001ULL,
+0x0101010000010001ULL, 0x0101014000010001ULL, 0x0101010001010001ULL, 0x0101014001010001ULL,
+0x0101010000000101ULL, 0x0101014000000101ULL, 0x0101010001000101ULL, 0x0101014001000101ULL,
+0x0101010000010101ULL, 0x0101014000010101ULL, 0x0101010001010101ULL, 0x0101014001010101ULL };
+
+}
============================================================
--- botan/pkcs5.cpp	cdf709aac78dc4cf416125512278e117589bf8e6
+++ botan/pkcs5.cpp	cdf709aac78dc4cf416125512278e117589bf8e6
@@ -0,0 +1,122 @@
+/*************************************************
+* PKCS #5 Source File                            *
+* (C) 1999-2005 The Botan Project                *
+*************************************************/
+
+#include <botan/pkcs5.h>
+#include <botan/lookup.h>
+#include <botan/hmac.h>
+#include <memory>
+
+namespace Botan {
+
+/*************************************************
+* Return a PKCS#5 PBKDF1 derived key             *
+*************************************************/
+OctetString PKCS5_PBKDF1::derive(u32bit key_len,
+                                 const std::string& passphrase,
+                                 const byte salt[], u32bit salt_size,
+                                 u32bit iterations) const
+   {
+   if(iterations == 0)
+      throw Invalid_Argument("PKCS#5 PBKDF1: Invalid iteration count");
+
+   std::auto_ptr<HashFunction> hash(get_hash(hash_name));
+   if(key_len > hash->OUTPUT_LENGTH)
+      throw Exception("PKCS#5 PBKDF1: Requested output length too long");
+
+   hash->update(passphrase);
+   hash->update(salt, salt_size);
+   SecureVector<byte> key = hash->final();
+
+   for(u32bit j = 1; j != iterations; j++)
+      {
+      hash->update(key);
+      hash->final(key);
+      }
+
+   return OctetString(key, std::min(key_len, key.size()));
+   }
+
+/*************************************************
+* Return the name of this type                   *
+*************************************************/
+std::string PKCS5_PBKDF1::name() const
+   {
+   return "PBKDF1(" + hash_name + ")";
+   }
+
+/*************************************************
+* PKCS5_PBKDF1 Constructor                       *
+*************************************************/
+PKCS5_PBKDF1::PKCS5_PBKDF1(const std::string& h_name) : hash_name(h_name)
+   {
+   if(!have_hash(hash_name))
+      throw Algorithm_Not_Found(hash_name);
+   }
+
+/*************************************************
+* Return a PKCS#5 PBKDF2 derived key             *
+*************************************************/
+OctetString PKCS5_PBKDF2::derive(u32bit key_len,
+                                 const std::string& passphrase,
+                                 const byte salt[], u32bit salt_size,
+                                 u32bit iterations) const
+   {
+   if(iterations == 0)
+      throw Invalid_Argument("PKCS#5 PBKDF2: Invalid iteration count");
+
+   if(passphrase.length() == 0)
+      throw Invalid_Argument("PKCS#5 PBKDF2: Empty passphrase is invalid");
+
+   HMAC hmac(hash_name);
+   hmac.set_key((const byte*)passphrase.c_str(), passphrase.length());
+   SecureVector<byte> key(key_len);
+
+   byte* T = key.begin();
+
+   u32bit counter = 1;
+   while(key_len)
+      {
+      u32bit T_size = std::min(hmac.OUTPUT_LENGTH, key_len);
+      SecureVector<byte> U(hmac.OUTPUT_LENGTH);
+
+      hmac.update(salt, salt_size);
+      for(u32bit j = 0; j != 4; j++)
+         hmac.update(get_byte(j, counter));
+      hmac.final(U);
+      xor_buf(T, U, T_size);
+
+      for(u32bit j = 1; j != iterations; j++)
+         {
+         hmac.update(U);
+         hmac.final(U);
+         xor_buf(T, U, T_size);
+         }
+
+      key_len -= T_size;
+      T += T_size;
+      counter++;
+      }
+
+   return key;
+   }
+
+/*************************************************
+* Return the name of this type                   *
+*************************************************/
+std::string PKCS5_PBKDF2::name() const
+   {
+   return "PBKDF2(" + hash_name + ")";
+   }
+
+/*************************************************
+* PKCS5_PBKDF2 Constructor                       *
+*************************************************/
+PKCS5_PBKDF2::PKCS5_PBKDF2(const std::string& h_name) : hash_name(h_name)
+   {
+   if(!have_hash(hash_name))
+      throw Algorithm_Not_Found(hash_name);
+   }
+
+}
============================================================
--- botan/pkcs5.h	660436fb11b2f632b3dba051539cf93d023ffaa6
+++ botan/pkcs5.h	660436fb11b2f632b3dba051539cf93d023ffaa6
@@ -0,0 +1,45 @@
+/*************************************************
+* PKCS #5 Header File                            *
+* (C) 1999-2005 The Botan Project                *
+*************************************************/
+
+#ifndef BOTAN_PKCS5_H__
+#define BOTAN_PKCS5_H__
+
+#include <botan/s2k.h>
+
+namespace Botan {
+
+/*************************************************
+* PKCS #5 PBKDF1                                 *
+*************************************************/
+class PKCS5_PBKDF1 : public S2K
+   {
+   public:
+      std::string name() const;
+      S2K* clone() const { return new PKCS5_PBKDF1(hash_name); }
+      PKCS5_PBKDF1(const std::string&);
+   private:
+      OctetString derive(u32bit, const std::string&,
+                          const byte[], u32bit, u32bit) const;
+      const std::string hash_name;
+   };
+
+/*************************************************
+* PKCS #5 PBKDF2                                 *
+*************************************************/
+class PKCS5_PBKDF2 : public S2K
+   {
+   public:
+      std::string name() const;
+      S2K* clone() const { return new PKCS5_PBKDF2(hash_name); }
+      PKCS5_PBKDF2(const std::string&);
+   private:
+      OctetString derive(u32bit, const std::string&,
+                          const byte[], u32bit, u32bit) const;
+      const std::string hash_name;
+   };
+
+}
+
+#endif
============================================================
--- ChangeLog	e3cb4410fbf089f5ba258314b15d2fb0494ec871
+++ ChangeLog	685c474f29d68ac662b431cc8e412343789e1e6d
@@ -1,3 +1,12 @@
+2005-09-26  Matt Johnston  <matt@ucc.asn.au>
+
+	* commands.cc, keys.cc, others: use standard
+	"PBE-PKCS5v20(SHA-1,TripleDES/CBC)" encoding rather than
+	raw arc4. extract_keys will re-encode keys, still
+	need to work on packet.cc encoding.
+	* botan/{des*,pkcs5*,algolist.cpp}: required files
+	from Botan 1.4.6
+
 2005-09-25  Timothy Brownawell  <tbrownaw@gmail.com>

 	Move private keys outside the database.
============================================================
--- Makefile.am	c3ca41e70b719d5d345383a893a7d4ba7823160c
+++ Makefile.am	09c4fb85c475a9a65d1367de3a4a9ce7c262f081
@@ -115,6 +115,7 @@ BOTAN_SOURCES =
         botan/x509_crl.cpp botan/x509_key.cpp botan/x509_obj.cpp	\
         botan/x509cert.cpp botan/x509find.cpp botan/x509opt.cpp		\
         botan/x509self.cpp botan/x509stor.cpp botan/x917_rng.cpp	\
+		botan/des.cpp botan/des_tab.cpp botan/pkcs5.cpp \
         \
         botan/aes.h botan/botan.h botan/def_eng.h botan/es_win32.h	\
         botan/lookup.h botan/omac.h botan/randpool.h botan/version.h	\
@@ -146,7 +147,7 @@ BOTAN_SOURCES =
         botan/data_src.h botan/es_egd.h botan/look_add.h botan/ofb.h	\
         botan/pk_util.h botan/ui.h botan/blinding.h botan/defalloc.h	\
         botan/es_file.h botan/look_pk.h botan/oids.h botan/pubkey.h	\
-        botan/util.h
+        botan/util.h botan/des.h botan/pkcs5.h


 BOOST_SANDBOX_SOURCES = \
============================================================
--- botan/algolist.cpp	e73a701e948afdcb723a29f89e88dbc793764d76
+++ botan/algolist.cpp	1f97304bc111e2f3ea06915975b63ec1c359b090
@@ -6,6 +6,7 @@
 #include <botan/lookup.h>

 #include <botan/aes.h>
+#include <botan/des.h>

 #include <botan/arc4.h>

@@ -15,6 +16,7 @@
 #include <botan/hmac.h>

 #include <botan/mode_pad.h>
+#include <botan/pkcs5.h>

 namespace Botan {

@@ -75,6 +77,9 @@ BlockCipher* get_block_cipher(const std:
    HANDLE_TYPE_NO_ARGS("AES-128", AES_128);
    HANDLE_TYPE_NO_ARGS("AES-192", AES_192);
    HANDLE_TYPE_NO_ARGS("AES-256", AES_256);
+   HANDLE_TYPE_NO_ARGS("DES", DES);
+   HANDLE_TYPE_NO_ARGS("DESX", DESX);
+   HANDLE_TYPE_NO_ARGS("TripleDES", TripleDES);

    return 0;
    }
@@ -136,6 +141,8 @@ S2K* get_s2k(const std::string& algo_spe
       return 0;
    const std::string algo_name = deref_alias(name[0]);

+   HANDLE_TYPE_ONE_STRING("PBKDF1", PKCS5_PBKDF1);
+   HANDLE_TYPE_ONE_STRING("PBKDF2", PKCS5_PBKDF2);
    return 0;
    }

============================================================
--- commands.cc	5e3307a36823404a734e65224da9966461d8e382
+++ commands.cc	10b5b48c3a9202ae481022dd03ddc778343ab16d
@@ -3760,9 +3760,19 @@ CMD(extract_keys, N_("debug"), N_(""),
   for (std::vector<rsa_keypair_id>::const_iterator i = privkeys.begin();
        i != privkeys.end(); ++i)
     {
+      base64< arc4<rsa_priv_key> > old_priv;
+      app.db.get_key(*i, old_priv);
+      // convert it to a newstyle key
       keypair kp;
-      app.db.get_key(*i, kp.priv);
-      app.db.get_key(*i, kp.pub);
+      migrate_private_key(app, *i, old_priv, kp);
+
+      // check the public key matches
+      base64< rsa_pub_key > pub;
+      app.db.get_key(*i, pub);
+      MM(pub);
+      MM(kp.pub);
+      N(keys_match(*i, pub, *i, kp.pub), F("public and private keys for %s don't match") % (*i)());
+
       app.keys.put_key_pair(*i, kp);
     }
 }
============================================================
--- database.cc	a1452325ac8f6aef8804ec53785ecbac5ee4cea6
+++ database.cc	2859331985e8687cd337886ff960d6ce0d6be7ae
@@ -523,7 +523,7 @@ database::rehash()
     for (size_t i = 0; i < res.size(); ++i)
       {
         hexenc<id> tmp;
-        key_hash_code(rsa_keypair_id(res[i][0]), base64< arc4<rsa_priv_key> >(res[i][1]), tmp);
+        key_hash_code(rsa_keypair_id(res[i][0]), base64< rsa_priv_key >(res[i][1]), tmp);
         execute("INSERT INTO private_keys VALUES(?, ?, ?)",
                 tmp().c_str(), res[i][0].c_str(), res[i][1].c_str());
         ++privkeys;
============================================================
--- keys.cc	0a144d76856af7fe643c529d9d2536a197fe15cb
+++ keys.cc	b43ff403dae506d2958e518965ed12c57dc1d93a
@@ -36,11 +36,11 @@ static void
 using Botan::byte;

 static void
-do_arc4(SecureVector<byte> & phrase,
+do_arc4(SecureVector<byte> & sym_key,
         SecureVector<byte> & payload)
 {
   L(F("running arc4 process on %d bytes of data\n") % payload.size());
-  Pipe enc(get_cipher("ARC4", phrase, ENCRYPTION));
+  Pipe enc(get_cipher("ARC4", sym_key, ENCRYPTION));
   enc.process_msg(payload);
   payload = enc.read_all();
 }
@@ -50,12 +50,11 @@ get_passphrase(lua_hooks & lua,
 static void
 get_passphrase(lua_hooks & lua,
                rsa_keypair_id const & keyid,
-               SecureVector<byte> & phrase,
+               string & phrase,
                bool confirm_phrase = false,
                bool force_from_user = false,
                string prompt_beginning = "enter passphrase")
 {
-  string lua_phrase;

   // we permit the user to relax security here, by caching a passphrase (if
   // they permit it) through the life of a program run. this helps when
@@ -66,17 +65,14 @@ get_passphrase(lua_hooks & lua,

   if (!force_from_user && phrases.find(keyid) != phrases.end())
     {
-      string phr = phrases[keyid];
-      phrase.set(reinterpret_cast<byte const *>(phr.data()), phr.size());
+      phrase = phrases[keyid];
       return;
     }

-  if (!force_from_user && lua.hook_get_passphrase(keyid, lua_phrase))
+  if (!force_from_user && lua.hook_get_passphrase(keyid, phrase))
     {
       // user is being a slob and hooking lua to return his passphrase
-      phrase.set(reinterpret_cast<const byte *>(lua_phrase.data()),
-                    lua_phrase.size());
-      N(lua_phrase != "",
+      N(phrase != "",
         F("got empty passphrase from get_passphrase() hook"));
     }
   else
@@ -123,7 +119,7 @@ get_passphrase(lua_hooks & lua,

       try
         {
-          phrase.set(reinterpret_cast<byte const *>(pass1), strlen(pass1));
+          phrase = pass1;

           // permit security relaxation. maybe.
           if (persist_phrase)
@@ -150,32 +146,30 @@ generate_key_pair(lua_hooks & lua,
                   string const unit_test_passphrase)
 {

-  SecureVector<byte> phrase, pubkey, privkey;
+  string phrase;
+  SecureVector<byte> pubkey, privkey;
   rsa_pub_key raw_pub_key;
-  arc4<rsa_priv_key> raw_priv_key;
+  rsa_priv_key raw_priv_key;

   // generate private key (and encrypt it)
   RSA_PrivateKey priv(constants::keylen);

-  Pipe p;
-  p.start_msg();
-  PKCS8::encode(priv, p, RAW_BER);
-  privkey = p.read_all();
-
   if (unit_test_passphrase.empty())
     get_passphrase(lua, id, phrase, true, true);
   else
-    phrase.set(reinterpret_cast<byte const *>(unit_test_passphrase.c_str()),
-                  unit_test_passphrase.size());
-  do_arc4(phrase, privkey);
-  raw_priv_key = string(reinterpret_cast<char const *>(privkey.begin()), privkey.size());
+    phrase = unit_test_passphrase;
+
+  Pipe p;
+  p.start_msg();
+  PKCS8::encrypt_key(priv, p, phrase,
+                     "PBE-PKCS5v20(SHA-1,TripleDES/CBC)", RAW_BER);
+  raw_priv_key = rsa_priv_key(p.read_all_as_string());

   // generate public key
   Pipe p2;
   p2.start_msg();
   X509::encode(priv, p2, RAW_BER);
-  pubkey = p2.read_all();
-  raw_pub_key = string(reinterpret_cast<char const *>(pubkey.begin()), pubkey.size());
+  raw_pub_key = rsa_pub_key(p2.read_all_as_string());

   // if all that worked, we can return our results to caller
   encode_base64(raw_priv_key, kp_out.priv);
@@ -186,52 +180,145 @@ generate_key_pair(lua_hooks & lua,
     % kp_out.priv().size());
 }

-void
-change_key_passphrase(lua_hooks & lua,
-                      rsa_keypair_id const & id,
-                      base64< arc4<rsa_priv_key> > & encoded_key)
+// ask for passphrase then decrypt a private key.
+shared_ptr<RSA_PrivateKey>
+get_private_key(lua_hooks & lua,
+                rsa_keypair_id const & id,
+                base64< rsa_priv_key > const & priv)
 {
-  SecureVector<byte> phrase;
-  get_passphrase(lua, id, phrase, false, true, "enter old passphrase");
+  rsa_priv_key decoded_key;
+  string phrase;
+  bool force = false;

+  L(F("base64-decoding %d-byte private key\n") % priv().size());
+  decode_base64(priv, decoded_key);
+  for (int i = 0; i < 3; ++i)
+    {
+      get_passphrase(lua, id, phrase, false, force);
+      L(F("have %d-byte encrypted private key\n") % decoded_key().size());
+
+      shared_ptr<PKCS8_PrivateKey> pkcs8_key;
+      try
+        {
+          Pipe p;
+          p.process_msg(decoded_key());
+          pkcs8_key = shared_ptr<PKCS8_PrivateKey>(PKCS8::load_key(p, phrase));
+        }
+      catch (...)
+        {
+          if (i >= 2)
+            throw informative_failure("failed to decrypt private RSA key, "
+                                      "probably incorrect passphrase");
+          // don't use the cache bad one next time
+          force = true;
+          continue;
+        }
+
+      shared_ptr<RSA_PrivateKey> priv_key;
+      priv_key = shared_dynamic_cast<RSA_PrivateKey>(pkcs8_key);
+      if (!priv_key)
+          throw informative_failure("Failed to get RSA signing key");
+
+      return priv_key;
+    }
+  I(false);
+}
+
+// converts an oldstyle arc4 encrypted key into a newstyle pkcs#8 encoded
+// key. the public key is also included
+void
+migrate_private_key(app_state & app,
+                    rsa_keypair_id const & id,
+                    base64< arc4<rsa_priv_key> > const & old_priv,
+                    keypair & new_kp)
+{
   arc4<rsa_priv_key> decoded_key;
-  SecureVector<byte> key_block;
-  decode_base64(encoded_key, decoded_key);
-  key_block.set(reinterpret_cast<byte const *>(decoded_key().data()),
-                   decoded_key().size());
-  do_arc4(phrase, key_block);
+  SecureVector<byte> decrypted_key;
+  string phrase;

-  try
+  bool force = false;
+
+  // need to decrypt the old key
+  shared_ptr<RSA_PrivateKey> priv_key;
+  L(F("base64-decoding %d-byte old private key\n") % old_priv().size());
+  decode_base64(old_priv, decoded_key);
+  for (int i = 0; i < 3; ++i)
     {
-      L(F("building signer from %d-byte decrypted private key\n") % key_block.size());
-      Pipe p;
-      p.process_msg(key_block);
-      shared_ptr<PKCS8_PrivateKey> pkcs8_key =
-        shared_ptr<PKCS8_PrivateKey>(PKCS8::load_key(p));
+      decrypted_key.set(reinterpret_cast<byte const *>(decoded_key().data()),
+                           decoded_key().size());
+      get_passphrase(app.lua, id, phrase, false, force);
+      SecureVector<byte> sym_key;
+      sym_key.set(reinterpret_cast<byte const *>(phrase.data()), phrase.size());
+      do_arc4(sym_key, decrypted_key);
+
+      L(F("building signer from %d-byte decrypted private key\n") % decrypted_key.size());
+
+      shared_ptr<PKCS8_PrivateKey> pkcs8_key;
+      try
+        {
+          Pipe p;
+          p.process_msg(decrypted_key);
+          pkcs8_key = shared_ptr<PKCS8_PrivateKey>(PKCS8::load_key(p));
+        }
+      catch (...)
+        {
+          if (i >= 2)
+            throw informative_failure("failed to decrypt old private RSA key, "
+                                      "probably incorrect passphrase");
+          // don't use the cache bad one next time
+          force = true;
+          continue;
+        }
+
+      priv_key = shared_dynamic_cast<RSA_PrivateKey>(pkcs8_key);
+      if (!priv_key)
+          throw informative_failure("Failed to get old RSA key");
     }
-  catch (...)
-    {
-      throw informative_failure("failed to decrypt private RSA key, "
-                                "probably incorrect passphrase");
-    }

-  get_passphrase(lua, id, phrase, true, true, "enter new passphrase");
-  do_arc4(phrase, key_block);
-  decoded_key = string(reinterpret_cast<char const *>(key_block.begin()),
-                       key_block.size());
+  I(priv_key);
+
+  // now we can write out the new key
+  Pipe p;
+  p.start_msg();
+  PKCS8::encrypt_key(*priv_key, p, phrase,
+                     "PBE-PKCS5v20(SHA-1,TripleDES/CBC)", RAW_BER);
+  rsa_priv_key raw_priv = rsa_priv_key(p.read_all_as_string());
+  encode_base64(raw_priv, new_kp.priv);
+
+  // also the public portion
+  Pipe p2;
+  p2.start_msg();
+  X509::encode(*priv_key, p2, RAW_BER);
+  rsa_pub_key raw_pub = rsa_pub_key(p2.read_all_as_string());
+  encode_base64(raw_pub, new_kp.pub);
+}
+
+void
+change_key_passphrase(lua_hooks & lua,
+                      rsa_keypair_id const & id,
+                      base64< rsa_priv_key > & encoded_key)
+{
+  shared_ptr<RSA_PrivateKey> priv = get_private_key(lua, id, encoded_key);
+
+  string new_phrase;
+  get_passphrase(lua, id, new_phrase, true, true, "enter new passphrase");
+
+  Pipe p;
+  p.start_msg();
+  PKCS8::encrypt_key(*priv, p, new_phrase,
+                     "PBE-PKCS5v20(SHA-1,TripleDES/CBC)", RAW_BER);
+  rsa_priv_key decoded_key = rsa_priv_key(p.read_all_as_string());
+
   encode_base64(decoded_key, encoded_key);
 }

 void
 make_signature(app_state & app,           // to hook for phrase
                rsa_keypair_id const & id, // to prompting user for phrase
-               base64< arc4<rsa_priv_key> > const & priv,
+               base64< rsa_priv_key > const & priv,
                string const & tosign,
                base64<rsa_sha1_signature> & signature)
 {
-  arc4<rsa_priv_key> decoded_key;
-  SecureVector<byte> decrypted_key;
-  SecureVector<byte> phrase;
   SecureVector<byte> sig;
   string sig_string;

@@ -241,7 +328,6 @@ make_signature(app_state & app,
   // something.

   bool persist_phrase = (!app.signers.empty()) || app.lua.hook_persist_phrase_ok();
-  bool force = false;

   shared_ptr<PK_Signer> signer;
   shared_ptr<RSA_PrivateKey> priv_key;
@@ -250,47 +336,16 @@ make_signature(app_state & app,

   else
     {
-      for (int i = 0; i < 3; ++i)
-        {
-          L(F("base64-decoding %d-byte private key\n") % priv().size());
-          decode_base64(priv, decoded_key);
-          decrypted_key.set(reinterpret_cast<byte const *>(decoded_key().data()),
-                               decoded_key().size());
-          get_passphrase(app.lua, id, phrase, false, force);
-          do_arc4(phrase, decrypted_key);
-
-          L(F("building signer from %d-byte decrypted private key\n") % decrypted_key.size());
-
-          shared_ptr<PKCS8_PrivateKey> pkcs8_key;
-          try
-            {
-              Pipe p;
-              p.process_msg(decrypted_key);
-              pkcs8_key = shared_ptr<PKCS8_PrivateKey>(PKCS8::load_key(p));
-            }
-          catch (...)
-            {
-              if (i >= 2)
-                throw informative_failure("failed to decrypt private RSA key, "
-                                          "probably incorrect passphrase");
-              // don't use the cache bad one next time
-              force = true;
-              continue;
-            }
-
-          priv_key = shared_dynamic_cast<RSA_PrivateKey>(pkcs8_key);
-          if (!priv_key)
-              throw informative_failure("Failed to get RSA signing key");
-
-          signer = shared_ptr<PK_Signer>(get_pk_signer(*priv_key, "EMSA3(SHA-1)"));
-
-          /* XXX This is ugly. We need to keep the key around as long
-           * as the signer is around, but the shared_ptr for the key will go
-           * away after we leave this scope. Hence we store a pair of
-           * <verifier,key> so they both exist. */
-          if (persist_phrase)
-            app.signers.insert(make_pair(id,make_pair(signer,priv_key)));
-        }
+      shared_ptr<RSA_PrivateKey> priv_key;
+      priv_key = get_private_key(app.lua, id, priv);
+      signer = shared_ptr<PK_Signer>(get_pk_signer(*priv_key, "EMSA3(SHA-1)"));
+
+      /* XXX This is ugly. We need to keep the key around as long
+       * as the signer is around, but the shared_ptr for the key will go
+       * away after we leave this scope. Hence we store a pair of
+       * <verifier,key> so they both exist. */
+      if (persist_phrase)
+        app.signers.insert(make_pair(id,make_pair(signer,priv_key)));
     }

   sig = signer->sign_message(reinterpret_cast<byte const *>(tosign.data()), tosign.size());
@@ -383,51 +438,19 @@ void decrypt_rsa(lua_hooks & lua,

 void decrypt_rsa(lua_hooks & lua,
                  rsa_keypair_id const & id,
-                 base64< arc4<rsa_priv_key> > const & priv,
+                 base64< rsa_priv_key > const & priv,
                  rsa_oaep_sha_data const & ciphertext,
                  std::string & plaintext)
 {
-  arc4<rsa_priv_key> decoded_key;
-  SecureVector<byte> decrypted_key;
-  SecureVector<byte> phrase;
-  shared_ptr<PK_Decryptor> decryptor;
-  shared_ptr<PKCS8_PrivateKey> pkcs8_key;
+  shared_ptr<RSA_PrivateKey> priv_key = get_private_key(lua, id, priv);

-  for (int i = 0; i < 3; i++)
-    {
-      bool force = false;
-      decode_base64(priv, decoded_key);
-      decrypted_key.set(reinterpret_cast<byte const *>(decoded_key().data()),
-                           decoded_key().size());
-      get_passphrase(lua, id, phrase, false, force);
-      do_arc4(phrase, decrypted_key);
+  shared_ptr<PK_Decryptor> decryptor;
+  decryptor = shared_ptr<PK_Decryptor>(get_pk_decryptor(*priv_key, "EME1(SHA-1)"));

-      try
-        {
-          Pipe p;
-          p.process_msg(decrypted_key);
-          pkcs8_key = shared_ptr<PKCS8_PrivateKey>(PKCS8::load_key(p));
-        }
-      catch (...)
-        {
-          if (i >= 2)
-            throw informative_failure("failed to decrypt private RSA key, "
-                                      "probably incorrect passphrase");
-          // don't use the cache bad one next time
-          force = true;
-          continue;
-        }
-    }
-
-    shared_ptr<RSA_PrivateKey> priv_key = shared_dynamic_cast<RSA_PrivateKey>(pkcs8_key);
-    if (!priv_key)
-        throw informative_failure("Failed to get RSA decrypting key");
-    decryptor = shared_ptr<PK_Decryptor>(get_pk_decryptor(*priv_key, "EME1(SHA-1)"));
-
-    SecureVector<byte> plain;
-    plain = decryptor->decrypt(
-          reinterpret_cast<byte const *>(ciphertext().data()), ciphertext().size());
-    plaintext = string(reinterpret_cast<char const*>(plain.begin()), plain.size());
+  SecureVector<byte> plain;
+  plain = decryptor->decrypt(
+        reinterpret_cast<byte const *>(ciphertext().data()), ciphertext().size());
+  plaintext = string(reinterpret_cast<char const*>(plain.begin()), plain.size());
 }

 void
@@ -466,7 +489,7 @@ key_hash_code(rsa_keypair_id const & id,

 void
 key_hash_code(rsa_keypair_id const & id,
-              base64< arc4<rsa_priv_key> > const & priv,
+              base64< rsa_priv_key > const & priv,
               hexenc<id> & out)
 {
   data tdat(id() + ":" + remove_ws(priv()));
@@ -489,9 +512,9 @@ keys_match(rsa_keypair_id const & id1,

 bool
 keys_match(rsa_keypair_id const & id1,
-           base64< arc4<rsa_priv_key> > const & key1,
+           base64< rsa_priv_key > const & key1,
            rsa_keypair_id const & id2,
-           base64< arc4<rsa_priv_key> > const & key2)
+           base64< rsa_priv_key > const & key2)
 {
   hexenc<id> hash1, hash2;
   key_hash_code(id1, key1, hash1);
============================================================
--- keys.hh	ec2036295cdf27e6ac7994fb9952360c364221f6
+++ keys.hh	37f54b83f95952ba438899513ca0991cc63d4d10
@@ -24,11 +24,16 @@ void change_key_passphrase(lua_hooks & l

 void change_key_passphrase(lua_hooks & lua,       // to hook for phrase
                            rsa_keypair_id const & id, // to prompting user for phrase
-                           base64< arc4<rsa_priv_key> > & encoded_key);
+                           base64< rsa_priv_key > & encoded_key);

+void migrate_private_key(app_state & app,
+                         rsa_keypair_id const & id,
+                         base64< arc4<rsa_priv_key> > const & old_priv,
+                         keypair & kp);
+
 void make_signature(app_state & app,           // to hook for phrase
                     rsa_keypair_id const & id, // to prompting user for phrase
-                    base64< arc4<rsa_priv_key> > const & priv,
+                    base64< rsa_priv_key > const & priv,
                     std::string const & tosign,
                     base64<rsa_sha1_signature> & signature);

@@ -49,7 +54,7 @@ void decrypt_rsa(lua_hooks & lua,

 void decrypt_rsa(lua_hooks & lua,
                  rsa_keypair_id const & id,
-                 base64< arc4<rsa_priv_key> > const & priv,
+                 base64< rsa_priv_key > const & priv,
                  rsa_oaep_sha_data const & ciphertext,
                  std::string & plaintext);

@@ -68,7 +73,7 @@ void key_hash_code(rsa_keypair_id const
                    hexenc<id> & out);

 void key_hash_code(rsa_keypair_id const & id,
-                   base64< arc4<rsa_priv_key> > const & priv,
+                   base64< rsa_priv_key > const & priv,
                    hexenc<id> & out);

 bool keys_match(rsa_keypair_id const & id1,
@@ -77,9 +82,9 @@ bool keys_match(rsa_keypair_id const & i
                 base64<rsa_pub_key> const & key2);

 bool keys_match(rsa_keypair_id const & id1,
-                base64< arc4<rsa_priv_key> > const & key1,
+                base64< rsa_priv_key > const & key1,
                 rsa_keypair_id const & id2,
-                base64< arc4<rsa_priv_key> > const & key2);
+                base64< rsa_priv_key > const & key2);


 #endif // __KEYS_HH__
============================================================
--- packet.cc	f4ca19df46ef590bb112762f222325ae2ddb98be
+++ packet.cc	ef8866949aab6ca49284575de0c4c63494efe3d1
@@ -1558,9 +1558,8 @@ packet_roundabout_test()
     pw.consume_public_key(rsa_keypair_id("test@lala.com"), puk);

     // a private key packet
-    base64< arc4<rsa_priv_key> > pik;
-    encode_base64(arc4<rsa_priv_key>
-                  (rsa_priv_key("this is not a real rsa key either!")), pik);
+    base64< rsa_priv_key > pik;
+    encode_base64(rsa_priv_key("this is not a real rsa key either!"), pik);

     pw.consume_key_pair(rsa_keypair_id("test@lala.com"), puk, pik);

============================================================
--- po/fr.po	2385bcc193a5aa321863cda06106737be42a1bee
+++ po/fr.po	d7aef69713125651e61b6d37b9377ae69a3fb561
@@ -2,11 +2,12 @@
 # This file is distributed under the same license as the monotone package.
 # Benoît Dejean <benoit@placenet.org>, 2005
 #
+#: commands.cc:3754
 msgid ""
 msgstr ""
 "Project-Id-Version: monotone 0.22\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2005-09-06 03:04+0200\n"
+"POT-Creation-Date: 2005-09-26 14:59+0800\n"
 "PO-Revision-Date: 2005-09-06 03:22+0200\n"
 "Last-Translator: Benoît Dejean <benoit@placenet.org>\n"
 "Language-Team: Benoît Dejean <benoit@placenet.org>\n"
@@ -15,459 +16,462 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n>1;\n"

-#: ../app_state.cc:51
+#: app_state.cc:53
 #, c-format
 msgid "initializing from directory %s\n"
 msgstr ""

-#: ../app_state.cc:62
+#: app_state.cc:64
 #, c-format
 msgid "branch name is '%s'\n"
 msgstr "le nom de la branche est « %s »\n"

-#: ../app_state.cc:69
+#: app_state.cc:71
 #, c-format
 msgid "setting dump path to %s\n"
 msgstr ""

-#: ../app_state.cc:83
+#: app_state.cc:85
 #, c-format
 msgid "working copy directory required but not found%s%s"
 msgstr ""

-#: ../app_state.cc:91
+#: app_state.cc:93
 #, c-format
 msgid "invalid directory ''"
 msgstr ""

-#: ../app_state.cc:93
+#: app_state.cc:95
 #, c-format
 msgid "creating working copy in %s\n"
 msgstr "création d'une copie de travail dans %s\n"

-#: ../app_state.cc:99
+#: app_state.cc:101
 #, c-format
 msgid "monotone bookkeeping directory '%s' already exists in '%s'\n"
 msgstr ""

-#: ../app_state.cc:102
+#: app_state.cc:104
 #, c-format
 msgid "creating bookkeeping directory '%s' for working copy in '%s'\n"
 msgstr ""

-#: ../app_state.cc:132
+#: app_state.cc:135
 #, c-format
 msgid "'%s' ignored by restricted path set\n"
 msgstr ""

-#: ../app_state.cc:137
+#: app_state.cc:140 app_state.cc:158
 #, c-format
 msgid "unknown path '%s'\n"
 msgstr "chemin inconnu « %s »\n"

-#: ../app_state.cc:139
+#: app_state.cc:142
 #, c-format
 msgid "'%s' added to restricted path set\n"
 msgstr ""

-#: ../app_state.cc:178
+#: app_state.cc:153
 #, c-format
-msgid "checking restricted path set for '%s'\n"
+msgid "'%s' ignored by excluded path set\n"
 msgstr ""

-#: ../app_state.cc:185
+#: app_state.cc:160
 #, c-format
-msgid "path '%s' found in restricted path set; '%s' included\n"
+msgid "'%s' added to excluded path set\n"
 msgstr ""

-#: ../app_state.cc:191
+#: app_state.cc:187
 #, c-format
-msgid "path '%s' not found in restricted path set; '%s' excluded\n"
+msgid "checking excluded path set for '%s'\n"
 msgstr ""

-#: ../app_state.cc:248
+#: app_state.cc:194 app_state.cc:227
+#, c-format
+msgid "path '%s' found in excluded path set; '%s' excluded\n"
+msgstr ""
+
+#: app_state.cc:213
+#, c-format
+msgid "checking restricted path set for '%s'\n"
+msgstr ""
+
+#: app_state.cc:221
+#, c-format
+msgid "path '%s' found in restricted path set; '%s' included\n"
+msgstr ""
+
+#: app_state.cc:297
 #, fuzzy, c-format
 msgid "search root '%s' does not exist"
 msgstr "le fichier rc « %s » n'existe pas"

-#: ../app_state.cc:249
+#: app_state.cc:298
 #, c-format
 msgid "search root '%s' is not a directory\n"
 msgstr ""

-#: ../app_state.cc:251
+#: app_state.cc:300
 #, c-format
 msgid "set search root to %s\n"
 msgstr ""

-#: ../app_state.cc:282
+#: app_state.cc:331
 #, c-format
 msgid "negative depth not allowed\n"
 msgstr "profondeur négative interdite\n"

-#: ../app_state.cc:290
+#: app_state.cc:339
 #, c-format
 msgid "negative or zero last not allowed\n"
 msgstr ""

-#: ../app_state.cc:399
+#: app_state.cc:448
 #, c-format
 msgid "Failed to read options file %s"
 msgstr ""

-#: ../app_state.cc:416
+#: app_state.cc:465
 #, c-format
 msgid "Failed to write options file %s"
 msgstr ""

-#: ../basic_io.cc:26 ../basic_io.cc:27
+#: basic_io.cc:26 basic_io.cc:27
 #, c-format
 msgid "error in %s:%d:%d:E: %s"
 msgstr ""

-#: ../cert.cc:49
+#: cert.cc:49
 #, c-format
 msgid "cert ok\n"
 msgstr "certificat OK\n"

-#: ../cert.cc:56
+#: cert.cc:56
 #, c-format
 msgid "ignoring bad signature by '%s' on '%s'\n"
 msgstr ""

-#: ../cert.cc:64
+#: cert.cc:64
 #, c-format
 msgid "ignoring unknown signature by '%s' on '%s'\n"
 msgstr ""

-#: ../cert.cc:121
+#: cert.cc:121
 #, c-format
 msgid "trust function liked %d signers of %s cert on manifest %s\n"
 msgstr ""

-#: ../cert.cc:127
+#: cert.cc:127
 #, c-format
 msgid "trust function disliked %d signers of %s cert on manifest %s\n"
 msgstr ""

-#: ../cert.cc:174
+#: cert.cc:174
 #, c-format
 msgid "trust function liked %d signers of %s cert on revision %s\n"
 msgstr ""

-#: ../cert.cc:180
+#: cert.cc:180
 #, c-format
 msgid "trust function disliked %d signers of %s cert on revision %s\n"
 msgstr ""

-#: ../cert.cc:269
+#: cert.cc:269
 #, c-format
 msgid "calculated cert hash '%s' does not match '%s'"
 msgstr ""

-#: ../cert.cc:302
+#: cert.cc:302
 #, c-format
 msgid "[%s@%s:%s]"
 msgstr ""

-#: ../cert.cc:303
+#: cert.cc:303
 #, c-format
 msgid "cert: signable text %s\n"
 msgstr ""

-#: ../cert.cc:364 ../keys.cc:508
+#: cert.cc:363
 #, c-format
-msgid "no private key '%s' found in database or get_priv_key hook"
+msgid "no private key '%s' found in key store or get_priv_key hook"
 msgstr ""

-#: ../cert.cc:373
+#: cert.cc:373
 #, c-format
-msgid "mismatch between private key '%s' in database and get_priv_key hook"
+msgid "mismatch between key '%s' in key store and get_key_pair hook"
 msgstr ""

-#: ../cert.cc:477
+#: cert.cc:481
 #, c-format
 msgid "no branch found for empty revision, please provide a branch name"
 msgstr ""

-#: ../cert.cc:486
+#: cert.cc:490
 #, c-format
 msgid "no branch certs found for revision %s, please provide a branch name"
 msgstr ""

-#: ../cert.cc:490
+#: cert.cc:494
 #, c-format
 msgid ""
 "multiple branch certs found for revision %s, please provide a branch name"
 msgstr ""

-#: ../cert.cc:507 ../rcs_import.cc:1231 ../revision.cc:1594
-#: ../revision.cc:1626
+#: cert.cc:511 rcs_import.cc:1231 revision.cc:1594 revision.cc:1626
 #, c-format
 msgid "no unique private key for cert construction"
 msgstr ""

-#: ../cert.cc:622
+#: cert.cc:626
 #, c-format
 msgid "no default author name for branch '%s'"
 msgstr ""

-#: ../change_set.cc:289
+#: change_set.cc:289
 #, c-format
 msgid "tid %d: parent %d, type %s, name %s\n"
 msgstr ""

-#: ../change_set.cc:315
+#: change_set.cc:315
 #, c-format
 msgid "%d -> %d\n"
 msgstr ""

-#: ../change_set.cc:1540
+#: change_set.cc:1540
 #, c-format
 msgid "concatenating change sets\n"
 msgstr ""

-#: ../change_set.cc:1563
+#: change_set.cc:1563
 #, c-format
 msgid "concatenating %d and %d deltas\n"
 msgstr ""

-#: ../change_set.cc:1573
+#: change_set.cc:1573
 #, c-format
 msgid "processing delta on %s\n"
 msgstr ""

-#: ../change_set.cc:1577
+#: change_set.cc:1577
 #, c-format
 msgid "delta on %s in first changeset renamed to %s\n"
 msgstr ""

-#. the delta should be removed if the file is going to be deleted
-#: ../change_set.cc:1582
+#: change_set.cc:1582
 #, c-format
 msgid "discarding delta [%s]->[%s] for deleted file '%s'\n"
 msgstr ""

-#: ../change_set.cc:1600
+#: change_set.cc:1600
 #, c-format
 msgid "fusing deltas on %s : %s -> %s and %s -> %s\n"
 msgstr ""

-#: ../change_set.cc:1614
+#: change_set.cc:1614
 #, c-format
 msgid "delta on %s in second changeset copied forward\n"
 msgstr ""

-#: ../change_set.cc:1628
+#: change_set.cc:1628
 #, c-format
 msgid "finished concatenation\n"
 msgstr ""

-#: ../change_set.cc:1734 ../change_set.cc:1741
+#: change_set.cc:1734 change_set.cc:1741
 #, c-format
 msgid "delete of %s dominates rename to %s\n"
 msgstr ""

-#: ../change_set.cc:1751
+#: change_set.cc:1751
 #, c-format
 msgid "unable to resolve file conflict '%s' -> '%s' vs. '%s'"
 msgstr ""

-#: ../change_set.cc:1755
+#: change_set.cc:1755
 #, c-format
 msgid "unable to resolve dir conflict '%s' -> '%s' vs. '%s'"
 msgstr ""

-#: ../change_set.cc:1760
+#: change_set.cc:1760
 #, c-format
 msgid "illegal conflict resolution '%s', wanted '%s' or '%s'\n"
 msgstr ""

-#: ../change_set.cc:1816
+#: change_set.cc:1816
 #, c-format
 msgid "tid %d (%s) clobbered tid %d (%s)\n"
 msgstr ""

-#: ../change_set.cc:1852
+#: change_set.cc:1852
 #, c-format
 msgid "skipping common change on %s (tid %d)\n"
 msgstr ""

-#: ../change_set.cc:1857
+#: change_set.cc:1857
 #, c-format
 msgid "skipping neutral change of %s -> %s (tid %d)\n"
 msgstr ""

-#: ../change_set.cc:1864
+#: change_set.cc:1864
 #, c-format
 msgid "propagating change on %s -> %s (tid %d)\n"
 msgstr ""

-#: ../change_set.cc:1880
+#: change_set.cc:1880
 #, c-format
 msgid "conflict detected, resolved in A's favour\n"
 msgstr "conflit détecté, résolu en faveur de A\n"

-#: ../change_set.cc:1886
+#: change_set.cc:1886
 #, c-format
 msgid "conflict detected, resolved in B's favour\n"
 msgstr "conflit détecté, résolu en faveur de B\n"

-#: ../change_set.cc:2053
+#: change_set.cc:2053
 #, c-format
 msgid "reusing merge resolution '%s' : '%s' -> '%s'\n"
 msgstr ""

-#: ../change_set.cc:2062
+#: change_set.cc:2062
 #, c-format
 msgid "merge of '%s' : '%s' vs. '%s' (no common ancestor) failed"
 msgstr ""

-#: ../change_set.cc:2069
+#: change_set.cc:2069
 #, c-format
 msgid "merge of '%s' : '%s' -> '%s' vs '%s' failed"
 msgstr ""

-#: ../change_set.cc:2073
+#: change_set.cc:2073
 #, c-format
 msgid "merge of '%s' : '%s' -> '%s' vs '%s' resolved to '%s'\n"
 msgstr ""

-#: ../change_set.cc:2131
+#: change_set.cc:2131
 #, c-format
 msgid "skipping delta '%s'->'%s' on deleted file '%s'\n"
 msgstr ""

-#. if no deltas in b, copy ours over using the merged name
-#: ../change_set.cc:2139
+#: change_set.cc:2139
 #, c-format
 msgid "merge is copying delta '%s' : '%s' -> '%s'\n"
 msgstr ""

-#. ... use the delta from 'a'
-#. 'a' change_set included a delta []->[...], ie file added. We want to
-#. follow this fork so it gets added to the b_merged changeset
-#: ../change_set.cc:2163
+#: change_set.cc:2163
 #, c-format
 msgid "propagating new file addition delta on '%s' : '%s' -> '%s'\n"
 msgstr ""

-#. ... ignore the delta
-#. 'b' change_set included a delta []->[...], ie file added. We don't need
-#. to add it to the b_merged changeset, since any delta in 'a' will be
-#. ignored (as 'b' includes deletions).
-#: ../change_set.cc:2175
+#: change_set.cc:2175
 #, c-format
 msgid "skipping new file addition delta on '%s' : '' -> '%s'\n"
 msgstr ""

-#. ... absorb identical deltas
-#: ../change_set.cc:2183
+#: change_set.cc:2183
 #, c-format
 msgid "skipping common delta '%s' : '%s' -> '%s'\n"
 msgstr ""

-#: ../change_set.cc:2189
+#: change_set.cc:2189
 #, c-format
 msgid "skipping neutral delta on '%s' : %s -> %s\n"
 msgstr ""

-#: ../change_set.cc:2197
+#: change_set.cc:2197
 #, c-format
 msgid "propagating unperturbed delta on '%s' : '%s' -> '%s'\n"
 msgstr ""

-#. ... or resolve conflict
-#: ../change_set.cc:2207
+#: change_set.cc:2207
 #, c-format
 msgid "merging delta '%s' : '%s' -> '%s' vs. '%s'\n"
 msgstr ""

-#: ../change_set.cc:2220
+#: change_set.cc:2220
 #, c-format
 msgid "resolved merge to '%s' : '%s' -> '%s'\n"
 msgstr ""

-#: ../change_set.cc:2249
+#: change_set.cc:2249
 #, c-format
 msgid "merging change sets\n"
 msgstr ""

-#: ../change_set.cc:2311
+#: change_set.cc:2311
 #, c-format
 msgid "finished merge\n"
 msgstr ""

-#: ../change_set.cc:2330
+#: change_set.cc:2330
 #, c-format
 msgid "inverting change set\n"
 msgstr ""

-#: ../change_set.cc:2360
+#: change_set.cc:2360
 #, c-format
 msgid "converted 'delete %s' to 'add as %s' in inverse\n"
 msgstr ""

-#: ../change_set.cc:2369
+#: change_set.cc:2369
 #, c-format
 msgid "converted add %s to delete in inverse\n"
 msgstr ""

-#: ../change_set.cc:2379
+#: change_set.cc:2379
 #, c-format
 msgid "converting delta %s -> %s on %s\n"
 msgstr ""

-#: ../change_set.cc:2381
+#: change_set.cc:2381
 #, c-format
 msgid "inverse is delta %s -> %s on %s\n"
 msgstr ""

-#: ../change_set.cc:2447 ../change_set.cc:2495
+#: change_set.cc:2447 change_set.cc:2495
 #, c-format
 msgid "moving file %s -> %s\n"
 msgstr "déplacement du fichier %s -> %s\n"

-#: ../change_set.cc:2454 ../change_set.cc:2503
+#: change_set.cc:2454 change_set.cc:2503
 #, c-format
 msgid "moving dir %s -> %s\n"
 msgstr "déplacement du dossier %s -> %s\n"

-#: ../commands.cc:136
+#: commands.cc:136
 #, c-format
 msgid "expanding command '%s'\n"
 msgstr ""

-#: ../commands.cc:153
+#: commands.cc:153
 #, c-format
 msgid "expanded command to '%s'\n"
 msgstr ""

-#: ../commands.cc:158
+#: commands.cc:158
 #, c-format
 msgid "command '%s' has multiple ambiguous expansions:\n"
 msgstr ""

-#: ../commands.cc:201
+#: commands.cc:201
 msgid "commands:"
 msgstr "commandes :"

-#: ../commands.cc:245
+#: commands.cc:245
 #, c-format
 msgid "executing command '%s'\n"
 msgstr "exécution de la commande « %s »\n"

-#: ../commands.cc:251
+#: commands.cc:251
 #, c-format
 msgid "unknown command '%s'\n"
 msgstr "commande inconnue « %s »\n"

-#: ../commands.cc:298
+#: commands.cc:298
 #, c-format
 msgid "pid file '%s' already exists"
 msgstr "le fichier pid « %s » existe déjà"

-#: ../commands.cc:368
+#: commands.cc:368
 msgid ""
 "Enter a description of this change.\n"
 "Lines beginning with `MT:' are removed automatically.\n"
@@ -475,16 +479,16 @@ msgstr ""
 "Saisissez une description pour cette modification.\n"
 "Les lignes débutant par « MT: » sont supprimées automatiquement.\n"

-#: ../commands.cc:375
+#: commands.cc:375
 #, c-format
 msgid "edit of log message failed"
 msgstr "l'édition du message du journal a échouée"

-#: ../commands.cc:384
+#: commands.cc:384
 msgid "note: "
 msgstr ""

-#: ../commands.cc:385
+#: commands.cc:385
 #, c-format
 msgid ""
 "branch '%s' has multiple heads\n"
@@ -493,60 +497,59 @@ msgstr ""
 "la branche « %s » a plusieurs heads\n"
 "vous devriez peut-être lancer « monotone merge »"

-#: ../commands.cc:445 ../commands.cc:666 ../commands.cc:1304
-#: ../commands.cc:1374 ../commands.cc:1742 ../commands.cc:2605
-#: ../commands.cc:2620 ../commands.cc:2623 ../commands.cc:2821
-#: ../commands.cc:3462
+#: commands.cc:445 commands.cc:672 commands.cc:1316 commands.cc:1386
+#: commands.cc:1754 commands.cc:2630 commands.cc:2645 commands.cc:2648
+#: commands.cc:2846 commands.cc:3487
 #, c-format
 msgid "no such revision '%s'"
 msgstr "aucune révision « %s »"

-#: ../commands.cc:452
+#: commands.cc:452
 #, c-format
 msgid "expanding selection '%s'\n"
 msgstr ""

-#: ../commands.cc:460
+#: commands.cc:460
 #, c-format
 msgid "no match for selection '%s'"
 msgstr ""

-#: ../commands.cc:463
+#: commands.cc:463
 #, c-format
 msgid "selection '%s' has multiple ambiguous expansions: \n"
 msgstr ""

-#: ../commands.cc:470
+#: commands.cc:470
 #, c-format
 msgid "expanded to '%s'\n"
 msgstr ""

-#: ../commands.cc:481
+#: commands.cc:481
 #, c-format
 msgid "non-hex digits in id"
 msgstr ""

-#: ../commands.cc:490
+#: commands.cc:490
 #, fuzzy, c-format
 msgid "partial id '%s' does not have an expansion"
 msgstr "le fichier rc « %s » n'existe pas"

-#: ../commands.cc:493
+#: commands.cc:493
 #, fuzzy, c-format
 msgid "partial id '%s' has multiple ambiguous expansions:\n"
 msgstr "le fichier rc « %s » n'existe pas"

-#: ../commands.cc:500
+#: commands.cc:500
 #, c-format
 msgid "expanded partial id '%s' to '%s'\n"
 msgstr ""

-#: ../commands.cc:527 ../keys.cc:510 ../netsync.cc:2194
+#: commands.cc:527 netsync.cc:2197
 #, c-format
 msgid "no public key '%s' found in database"
 msgstr "aucune clef publique « %s » dans la base de données"

-#: ../commands.cc:537
+#: commands.cc:537
 #, c-format
 msgid ""
 "Key   : %s\n"
@@ -559,71 +562,71 @@ msgstr ""
 "Nom       : %s\n"
 "Valeur    : %s\n"

-#: ../commands.cc:571
+#: commands.cc:571
 msgid "ok"
 msgstr "0K"

-#: ../commands.cc:574
+#: commands.cc:574
 msgid "bad"
 msgstr "mauvais"

-#: ../commands.cc:577
+#: commands.cc:577
 msgid "unknown"
 msgstr "inconnu"

-#: ../commands.cc:652
+#: commands.cc:658
 #, c-format
 msgid "no keys found\n"
 msgstr "aucune clef trouvée\n"

-#: ../commands.cc:654
+#: commands.cc:660
 #, c-format
 msgid "no keys found matching '%s'\n"
 msgstr "aucune clef correspondant à « %s »\n"

-#: ../commands.cc:672
+#: commands.cc:678
 #, c-format
 msgid "revision %s already has children. We cannot kill it."
 msgstr "la révision %s a déjà des descendants. Impossible de la tuer."

-#: ../commands.cc:802 ../commands.cc:824 ../commands.cc:856 ../commands.cc:880
-#: ../commands.cc:920
+#: commands.cc:808 commands.cc:829 commands.cc:868 commands.cc:892
+#: commands.cc:932
 msgid "key and cert"
 msgstr "clef et certificat"

-#: ../commands.cc:802 ../commands.cc:824 ../commands.cc:856
+#: commands.cc:808 commands.cc:829 commands.cc:868
 msgid "KEYID"
 msgstr "IDCLEF"

-#: ../commands.cc:802
+#: commands.cc:808
 msgid "generate an RSA key-pair"
 msgstr "générer une paire de clefs RSA"

-#: ../commands.cc:812
-#, c-format
-msgid "key '%s' already exists in database"
-msgstr "la clef « %s » est déjà dans la base de données"
+#: commands.cc:818
+#, fuzzy, c-format
+msgid "key '%s' already exists"
+msgstr "le fichier pid « %s » existe déjà"

-#: ../commands.cc:816
+#: commands.cc:821
 #, c-format
 msgid "generating key-pair '%s'\n"
 msgstr ""

-#: ../commands.cc:818
+#: commands.cc:823
 #, c-format
 msgid "storing key-pair '%s' in database\n"
 msgstr ""

-#: ../commands.cc:824
+#: commands.cc:829
 msgid "drop a public and private key"
 msgstr "supprimer une clef publique et privée"

-#: ../commands.cc:835
+#: commands.cc:840
 #, c-format
 msgid "dropping public key '%s' from database\n"
 msgstr ""

-#: ../commands.cc:842
+#: commands.cc:847
 #, c-format
 msgid ""
 "dropping private key '%s' from database\n"
@@ -632,7 +635,7 @@ msgstr ""
 "suppression de la clef privée « %s » de la base de données\n"
 "\n"

-#: ../commands.cc:843
+#: commands.cc:848
 #, c-format
 msgid ""
 "the private key data may not have been erased from the\n"
@@ -640,49 +643,58 @@ msgstr ""
 "'db load' to be sure."
 msgstr ""

-#: ../commands.cc:851
-#, c-format
-msgid "public or private key '%s' does not exist in database"
+#: commands.cc:857
+#, fuzzy, c-format
+msgid ""
+"dropping key pair '%s' from key store\n"
+"\n"
+msgstr ""
+"suppression de la clef privée « %s » de la base de données\n"
+"\n"
+
+#: commands.cc:863
+#, fuzzy, c-format
+msgid "public or private key '%s' does not exist"
 msgstr "la clef publique ou privée « %s » n'existe pas dans la base de données"

-#: ../commands.cc:857
+#: commands.cc:869
 msgid "change passphrase of a private RSA key"
 msgstr "changer la phrase de passe pour une clef RSA privée"

-#: ../commands.cc:868
-#, c-format
-msgid "key '%s' does not exist in database"
+#: commands.cc:880
+#, fuzzy, c-format
+msgid "key '%s' does not exist in the key store"
 msgstr "la clef « %s » n'existe pas dans la base de données"

-#: ../commands.cc:875
+#: commands.cc:887
 #, c-format
 msgid "passphrase changed\n"
 msgstr "la phrase de passe à changée\n"

-#: ../commands.cc:880
+#: commands.cc:892
 msgid "REVISION CERTNAME [CERTVAL]"
 msgstr ""

-#: ../commands.cc:881
+#: commands.cc:893
 msgid "create a cert for a revision"
 msgstr "créer un certificat pour une révision"

-#: ../commands.cc:901
+#: commands.cc:913
 #, c-format
 msgid "no unique private key found, and no key specified"
 msgstr ""

-#: ../commands.cc:920
+#: commands.cc:932
 msgid "REVISION NAME VALUE SIGNER1 [SIGNER2 [...]]"
 msgstr ""

-#: ../commands.cc:921
+#: commands.cc:933
 msgid ""
 "test whether a hypothetical cert would be trusted\n"
 "by current settings"
 msgstr ""

-#: ../commands.cc:954
+#: commands.cc:966
 #, c-format
 msgid ""
 "if a cert on: %s\n"
@@ -692,205 +704,192 @@ msgstr ""
 "it would be: %s\n"
 msgstr ""

-#: ../commands.cc:963
+#: commands.cc:975
 msgid "trusted"
 msgstr ""

-#: ../commands.cc:963
+#: commands.cc:975
 msgid "UNtrusted"
 msgstr ""

-#: ../commands.cc:966 ../commands.cc:979 ../commands.cc:991
-#: ../commands.cc:1008 ../commands.cc:1054
+#: commands.cc:978 commands.cc:991 commands.cc:1003 commands.cc:1020
+#: commands.cc:1066
 msgid "review"
 msgstr ""

-#: ../commands.cc:966
+#: commands.cc:978
 msgid "REVISION TAGNAME"
 msgstr ""

-#: ../commands.cc:967
+#: commands.cc:979
 #, fuzzy
 msgid "put a symbolic tag cert on a revision version"
 msgstr "mettre une certificat-étiquette symbolique"

-#: ../commands.cc:979
+#: commands.cc:991
 msgid "ID (pass|fail|true|false|yes|no|1|0)"
 msgstr ""

-#: ../commands.cc:980
+#: commands.cc:992
 msgid "note the results of running a test on a revision"
 msgstr ""

-#: ../commands.cc:991 ../commands.cc:1008
+#: commands.cc:1003 commands.cc:1020
 msgid "REVISION"
 msgstr ""

-#: ../commands.cc:992
+#: commands.cc:1004
 msgid "approve of a particular revision"
 msgstr "approuver une révision particulière"

-#: ../commands.cc:1003
+#: commands.cc:1015
 #, c-format
 msgid "need --branch argument for approval"
 msgstr ""

-#: ../commands.cc:1009
+#: commands.cc:1021
 msgid "disapprove of a particular revision"
 msgstr ""

-#: ../commands.cc:1022
+#: commands.cc:1034
 #, fuzzy, c-format
 msgid "revision '%s' has %d changesets, cannot invert\n"
 msgstr "la révision %s n'existe pas"

-#: ../commands.cc:1026
+#: commands.cc:1038
 #, c-format
 msgid "need --branch argument for disapproval"
 msgstr ""

-#: ../commands.cc:1054
+#: commands.cc:1066
 msgid "REVISION [COMMENT]"
 msgstr ""

-#: ../commands.cc:1055
+#: commands.cc:1067
 msgid "comment on a particular revision"
 msgstr ""

-#: ../commands.cc:1065
+#: commands.cc:1077
 #, c-format
 msgid "edit comment failed"
 msgstr "l'édition du commentaire a échouée"

-#: ../commands.cc:1068
+#: commands.cc:1080
 #, c-format
 msgid "empty comment"
 msgstr "commentaire vide"

-#. static void dump_change_set(string const & name,
-#. change_set & cs)
-#. {
-#. data dat;
-#. write_change_set(cs, dat);
-#. cout << "change set '" << name << "'\n" << dat << endl;
-#. }
-#: ../commands.cc:1078 ../commands.cc:1103 ../commands.cc:1130
-#: ../commands.cc:1262 ../commands.cc:2092 ../commands.cc:2215
-#: ../commands.cc:2770 ../commands.cc:3303
+#: commands.cc:1090 commands.cc:1115 commands.cc:1142 commands.cc:1274
+#: commands.cc:2114 commands.cc:2237 commands.cc:2795 commands.cc:3328
 msgid "working copy"
 msgstr "copie de travail"

-#: ../commands.cc:1078 ../commands.cc:1103
+#: commands.cc:1090 commands.cc:1115
 msgid "PATH..."
 msgstr "CHEMIN..."

-#: ../commands.cc:1079
+#: commands.cc:1091
 msgid "add files to working copy"
 msgstr "ajouter des fichiers à la copie de travail"

-#: ../commands.cc:1104
+#: commands.cc:1116
 msgid "drop files from working copy"
 msgstr "supprimer des fichiers de la copie de travail"

-#: ../commands.cc:1130
+#: commands.cc:1142
 msgid "SRC DST"
 msgstr "SRC DST"

-#: ../commands.cc:1131
+#: commands.cc:1143
 msgid "rename entries in the working copy"
 msgstr "renommer des entrées dans la copie de travail"

-#. fload and fmerge are simple commands for debugging the line
-#. merger.
-#: ../commands.cc:1159 ../commands.cc:1172 ../commands.cc:2691
-#: ../commands.cc:2708 ../commands.cc:3363
+#: commands.cc:1171 commands.cc:1184 commands.cc:2716 commands.cc:2733
+#: commands.cc:3388 commands.cc:3754
 msgid "debug"
 msgstr ""

-#: ../commands.cc:1159
+#: commands.cc:1171
 msgid "load file contents into db"
 msgstr "charger le contenu du fichier dans la base de données"

-#: ../commands.cc:1172
+#: commands.cc:1184
 msgid "<parent> <left> <right>"
 msgstr "<parent> <gauche> <droite>"

-#: ../commands.cc:1173
+#: commands.cc:1185
 msgid "merge 3 files and output result"
 msgstr ""

-#: ../commands.cc:1183
+#: commands.cc:1195
 #, c-format
 msgid "ancestor file id does not exist"
 msgstr ""

-#: ../commands.cc:1186
+#: commands.cc:1198
 #, c-format
 msgid "left file id does not exist"
 msgstr ""

-#: ../commands.cc:1189
+#: commands.cc:1201
 #, c-format
 msgid "right file id does not exist"
 msgstr ""

-#: ../commands.cc:1200
+#: commands.cc:1212
 #, c-format
 msgid "merge failed"
 msgstr ""

-#: ../commands.cc:1205 ../commands.cc:1285 ../commands.cc:1631
-#: ../commands.cc:2558 ../commands.cc:3246 ../commands.cc:3443
-#: ../commands.cc:3480
+#: commands.cc:1217 commands.cc:1297 commands.cc:1643 commands.cc:2583
+#: commands.cc:3271 commands.cc:3468 commands.cc:3505
 msgid "informative"
 msgstr "information"

-#: ../commands.cc:1205 ../commands.cc:2215 ../commands.cc:2558
-#: ../commands.cc:3303
+#: commands.cc:1217 commands.cc:2237 commands.cc:2583 commands.cc:3328
 msgid "[PATH]..."
 msgstr ""

-#: ../commands.cc:1205
+#: commands.cc:1217
 msgid "show status of working copy"
 msgstr "afficher l'état de la copie de travail"

-#: ../commands.cc:1262
+#: commands.cc:1274
 msgid "[PATH]"
 msgstr ""

-#: ../commands.cc:1263
+#: commands.cc:1275
 msgid "calculate identity of PATH or stdin"
 msgstr ""

-#: ../commands.cc:1286
+#: commands.cc:1298
 msgid "FILENAME"
 msgstr ""

-#: ../commands.cc:1287
+#: commands.cc:1299
 msgid "write file from database to stdout"
 msgstr ""

-#: ../commands.cc:1318
+#: commands.cc:1330
 #, c-format
 msgid "no file '%s' found in revision '%s'\n"
 msgstr ""

-#: ../commands.cc:1322
+#: commands.cc:1334
 #, fuzzy, c-format
 msgid "dumping file '%s'\n"
 msgstr "importation du fichier « %s »\n"

-#: ../commands.cc:1330 ../commands.cc:1437 ../commands.cc:3046
-#: ../commands.cc:3095 ../commands.cc:318