1 // dsa.cpp - originally written and placed in the public domain by Wei Dai
2
3 #include "pch.h"
4
5 #ifndef CRYPTOPP_IMPORTS
6
7 #include "dsa.h"
8 #include "asn.h"
9 #include "integer.h"
10 #include "filters.h"
11 #include "nbtheory.h"
12
NAMESPACE_BEGIN(CryptoPP)13 NAMESPACE_BEGIN(CryptoPP)
14
15 size_t DSAConvertSignatureFormat(byte *buffer, size_t bufferSize, DSASignatureFormat toFormat, const byte *signature, size_t signatureLen, DSASignatureFormat fromFormat)
16 {
17 Integer r, s;
18 StringStore store(signature, signatureLen);
19 ArraySink sink(buffer, bufferSize);
20
21 switch (fromFormat)
22 {
23 case DSA_P1363:
24 r.Decode(store, signatureLen/2);
25 s.Decode(store, signatureLen/2);
26 break;
27 case DSA_DER:
28 {
29 BERSequenceDecoder seq(store);
30 r.BERDecode(seq);
31 s.BERDecode(seq);
32 seq.MessageEnd();
33 break;
34 }
35 case DSA_OPENPGP:
36 r.OpenPGPDecode(store);
37 s.OpenPGPDecode(store);
38 break;
39 }
40
41 switch (toFormat)
42 {
43 case DSA_P1363:
44 r.Encode(sink, bufferSize/2);
45 s.Encode(sink, bufferSize/2);
46 break;
47 case DSA_DER:
48 {
49 DERSequenceEncoder seq(sink);
50 r.DEREncode(seq);
51 s.DEREncode(seq);
52 seq.MessageEnd();
53 break;
54 }
55 case DSA_OPENPGP:
56 r.OpenPGPEncode(sink);
57 s.OpenPGPEncode(sink);
58 break;
59 }
60
61 return (size_t)sink.TotalPutLength();
62 }
63
64 NAMESPACE_END
65
66 #endif
67