00001
00002
00003 #include "pch.h"
00004
00005 #ifndef CRYPTOPP_IMPORTS
00006
00007 #include "dsa.h"
00008 #include "nbtheory.h"
00009
00010 NAMESPACE_BEGIN(CryptoPP)
00011
00012 size_t DSAConvertSignatureFormat(byte *buffer, size_t bufferSize, DSASignatureFormat toFormat, const byte *signature, size_t signatureLen, DSASignatureFormat fromFormat)
00013 {
00014 Integer r, s;
00015 StringStore store(signature, signatureLen);
00016 ArraySink sink(buffer, bufferSize);
00017
00018 switch (fromFormat)
00019 {
00020 case DSA_P1363:
00021 r.Decode(store, signatureLen/2);
00022 s.Decode(store, signatureLen/2);
00023 break;
00024 case DSA_DER:
00025 {
00026 BERSequenceDecoder seq(store);
00027 r.BERDecode(seq);
00028 s.BERDecode(seq);
00029 seq.MessageEnd();
00030 break;
00031 }
00032 case DSA_OPENPGP:
00033 r.OpenPGPDecode(store);
00034 s.OpenPGPDecode(store);
00035 break;
00036 }
00037
00038 switch (toFormat)
00039 {
00040 case DSA_P1363:
00041 r.Encode(sink, bufferSize/2);
00042 s.Encode(sink, bufferSize/2);
00043 break;
00044 case DSA_DER:
00045 {
00046 DERSequenceEncoder seq(sink);
00047 r.DEREncode(seq);
00048 s.DEREncode(seq);
00049 seq.MessageEnd();
00050 break;
00051 }
00052 case DSA_OPENPGP:
00053 r.OpenPGPEncode(sink);
00054 s.OpenPGPEncode(sink);
00055 break;
00056 }
00057
00058 return (size_t)sink.TotalPutLength();
00059 }
00060
00061 NAMESPACE_END
00062
00063 #endif