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