Crypto++
dsa.cpp
1 // dsa.cpp - 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 "nbtheory.h"
9 
10 NAMESPACE_BEGIN(CryptoPP)
11 
12 size_t DSAConvertSignatureFormat(byte *buffer, size_t bufferSize, DSASignatureFormat toFormat, const byte *signature, size_t signatureLen, DSASignatureFormat fromFormat)
13 {
14  Integer r, s;
15  StringStore store(signature, signatureLen);
16  ArraySink sink(buffer, bufferSize);
17 
18  switch (fromFormat)
19  {
20  case DSA_P1363:
21  r.Decode(store, signatureLen/2);
22  s.Decode(store, signatureLen/2);
23  break;
24  case DSA_DER:
25  {
26  BERSequenceDecoder seq(store);
27  r.BERDecode(seq);
28  s.BERDecode(seq);
29  seq.MessageEnd();
30  break;
31  }
32  case DSA_OPENPGP:
33  r.OpenPGPDecode(store);
34  s.OpenPGPDecode(store);
35  break;
36  }
37 
38  switch (toFormat)
39  {
40  case DSA_P1363:
41  r.Encode(sink, bufferSize/2);
42  s.Encode(sink, bufferSize/2);
43  break;
44  case DSA_DER:
45  {
46  DERSequenceEncoder seq(sink);
47  r.DEREncode(seq);
48  s.DEREncode(seq);
49  seq.MessageEnd();
50  break;
51  }
52  case DSA_OPENPGP:
53  r.OpenPGPEncode(sink);
54  s.OpenPGPEncode(sink);
55  break;
56  }
57 
58  return (size_t)sink.TotalPutLength();
59 }
60 
61 NAMESPACE_END
62 
63 #endif