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