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