00001
#ifndef CRYPTOPP_IDA_H
00002
#define CRYPTOPP_IDA_H
00003
00004
#include "mqueue.h"
00005
#include "filters.h"
00006
#include "channels.h"
00007
#include <map>
00008
#include <vector>
00009
00010 NAMESPACE_BEGIN(CryptoPP)
00011
00012
00013 class
RawIDA : public AutoSignaling<Unflushable<Multichannel<
Filter> > >
00014 {
00015
public:
00016
RawIDA(
BufferedTransformation *attachment=NULL)
00017 : AutoSignaling<Unflushable<Multichannel<Filter> > >(attachment) {}
00018
00019
unsigned int GetThreshold()
const {
return m_threshold;}
00020
void AddOutputChannel(word32 channelId);
00021
void ChannelData(word32 channelId,
const byte *inString,
unsigned int length,
bool messageEnd);
00022
unsigned int InputBuffered(word32 channelId)
const;
00023
00024
void ChannelInitialize(
const std::string &channel,
const NameValuePairs ¶meters=g_nullNameValuePairs,
int propagation=-1);
00025
unsigned int ChannelPut2(
const std::string &channel,
const byte *begin,
unsigned int length,
int messageEnd,
bool blocking)
00026 {
00027
if (!blocking)
00028
throw BlockingInputOnly(
"RawIDA");
00029 ChannelData(StringToWord<word32>(channel), begin, length, messageEnd != 0);
00030
return 0;
00031 }
00032
00033
protected:
00034
virtual void FlushOutputQueues();
00035
virtual void OutputMessageEnds();
00036
00037
unsigned int InsertInputChannel(word32 channelId);
00038
unsigned int LookupInputChannel(word32 channelId)
const;
00039
void ComputeV(
unsigned int);
00040
void PrepareInterpolation();
00041
void ProcessInputQueues();
00042
00043 std::map<word32, unsigned int> m_inputChannelMap;
00044 std::map<word32, unsigned int>::iterator m_lastMapPosition;
00045 std::vector<MessageQueue> m_inputQueues;
00046 std::vector<word32> m_inputChannelIds, m_outputChannelIds, m_outputToInput;
00047 std::vector<std::string> m_outputChannelIdStrings;
00048 std::vector<ByteQueue> m_outputQueues;
00049
int m_threshold;
00050
unsigned int m_channelsReady, m_channelsFinished;
00051 std::vector<SecBlock<word32> > m_v;
00052
SecBlock<word32> m_u, m_w, m_y;
00053 };
00054
00055
00056 class SecretSharing :
public CustomSignalPropagation<Filter>
00057 {
00058
public:
00059
SecretSharing(
RandomNumberGenerator &rng,
int threshold,
int nShares,
BufferedTransformation *attachment=NULL,
bool addPadding=
true)
00060 : CustomSignalPropagation<Filter>(attachment), m_rng(rng), m_ida(
new OutputProxy(*
this,
true))
00061 {Initialize(MakeParameters(
"RecoveryThreshold", threshold)(
"NumberOfShares", nShares)(
"AddPadding", addPadding), 0);}
00062
00063
void Initialize(
const NameValuePairs ¶meters=g_nullNameValuePairs,
int propagation=-1);
00064
unsigned int Put2(
const byte *begin,
unsigned int length,
int messageEnd,
bool blocking);
00065
bool Flush(
bool hardFlush,
int propagation=-1,
bool blocking=
true) {
return m_ida.Flush(hardFlush, propagation, blocking);}
00066
00067
protected:
00068
RandomNumberGenerator &m_rng;
00069
RawIDA m_ida;
00070
bool m_pad;
00071 };
00072
00073
00074 class SecretRecovery :
public RawIDA
00075 {
00076
public:
00077
SecretRecovery(
int threshold,
BufferedTransformation *attachment=NULL,
bool removePadding=
true)
00078 :
RawIDA(attachment)
00079 {Initialize(MakeParameters(
"RecoveryThreshold", threshold)(
"RemovePadding", removePadding), 0);}
00080
00081
void Initialize(
const NameValuePairs ¶meters=g_nullNameValuePairs,
int propagation=-1);
00082
00083
protected:
00084
void FlushOutputQueues();
00085
void OutputMessageEnds();
00086
00087
bool m_pad;
00088 };
00089
00090
00091 class InformationDispersal :
public CustomSignalPropagation<Filter>
00092 {
00093
public:
00094
InformationDispersal(
int threshold,
int nShares,
BufferedTransformation *attachment=NULL,
bool addPadding=
true)
00095 : CustomSignalPropagation<Filter>(attachment), m_ida(
new OutputProxy(*
this,
true))
00096 {Initialize(MakeParameters(
"RecoveryThreshold", threshold)(
"NumberOfShares", nShares)(
"AddPadding", addPadding), 0);}
00097
00098
void Initialize(
const NameValuePairs ¶meters=g_nullNameValuePairs,
int propagation=-1);
00099
unsigned int Put2(
const byte *begin,
unsigned int length,
int messageEnd,
bool blocking);
00100
bool Flush(
bool hardFlush,
int propagation=-1,
bool blocking=
true) {
return m_ida.Flush(hardFlush, propagation, blocking);}
00101
00102
protected:
00103
RawIDA m_ida;
00104
bool m_pad;
00105
unsigned int m_nextChannel;
00106 };
00107
00108
00109 class InformationRecovery :
public RawIDA
00110 {
00111
public:
00112
InformationRecovery(
int threshold,
BufferedTransformation *attachment=NULL,
bool removePadding=
true)
00113 :
RawIDA(attachment)
00114 {Initialize(MakeParameters(
"RecoveryThreshold", threshold)(
"RemovePadding", removePadding), 0);}
00115
00116
void Initialize(
const NameValuePairs ¶meters=g_nullNameValuePairs,
int propagation=-1);
00117
00118
protected:
00119
void FlushOutputQueues();
00120
void OutputMessageEnds();
00121
00122
bool m_pad;
00123
ByteQueue m_queue;
00124 };
00125
00126
class PaddingRemover :
public Unflushable<Filter>
00127 {
00128
public:
00129 PaddingRemover(
BufferedTransformation *attachment=NULL)
00130 : Unflushable<
Filter>(attachment), m_possiblePadding(false) {}
00131
00132
void IsolatedInitialize(
const NameValuePairs ¶meters) {m_possiblePadding =
false;}
00133
unsigned int Put2(
const byte *begin,
unsigned int length,
int messageEnd,
bool blocking);
00134
00135
00136
bool GetPossiblePadding()
const {
return m_possiblePadding;}
00137
00138
private:
00139
bool m_possiblePadding;
00140
unsigned long m_zeroCount;
00141 };
00142
00143 NAMESPACE_END
00144
00145
#endif