summaryrefslogtreecommitdiff
path: root/external/crypto++-5.6.3/dsa.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'external/crypto++-5.6.3/dsa.cpp')
-rw-r--r--external/crypto++-5.6.3/dsa.cpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/external/crypto++-5.6.3/dsa.cpp b/external/crypto++-5.6.3/dsa.cpp
new file mode 100644
index 0000000..87cc7da
--- /dev/null
+++ b/external/crypto++-5.6.3/dsa.cpp
@@ -0,0 +1,66 @@
+// dsa.cpp - written and placed in the public domain by Wei Dai
+
+#include "pch.h"
+
+#ifndef CRYPTOPP_IMPORTS
+
+#include "dsa.h"
+#include "asn.h"
+#include "integer.h"
+#include "filters.h"
+#include "nbtheory.h"
+
+NAMESPACE_BEGIN(CryptoPP)
+
+size_t DSAConvertSignatureFormat(byte *buffer, size_t bufferSize, DSASignatureFormat toFormat, const byte *signature, size_t signatureLen, DSASignatureFormat fromFormat)
+{
+ Integer r, s;
+ StringStore store(signature, signatureLen);
+ ArraySink sink(buffer, bufferSize);
+
+ switch (fromFormat)
+ {
+ case DSA_P1363:
+ r.Decode(store, signatureLen/2);
+ s.Decode(store, signatureLen/2);
+ break;
+ case DSA_DER:
+ {
+ BERSequenceDecoder seq(store);
+ r.BERDecode(seq);
+ s.BERDecode(seq);
+ seq.MessageEnd();
+ break;
+ }
+ case DSA_OPENPGP:
+ r.OpenPGPDecode(store);
+ s.OpenPGPDecode(store);
+ break;
+ }
+
+ switch (toFormat)
+ {
+ case DSA_P1363:
+ r.Encode(sink, bufferSize/2);
+ s.Encode(sink, bufferSize/2);
+ break;
+ case DSA_DER:
+ {
+ DERSequenceEncoder seq(sink);
+ r.DEREncode(seq);
+ s.DEREncode(seq);
+ seq.MessageEnd();
+ break;
+ }
+ case DSA_OPENPGP:
+ r.OpenPGPEncode(sink);
+ s.OpenPGPEncode(sink);
+ break;
+ }
+
+ return (size_t)sink.TotalPutLength();
+}
+
+NAMESPACE_END
+
+#endif