Crypto++  5.6.3
Free C++ class library of cryptographic schemes
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 "asn.h"
9 #include "integer.h"
10 #include "filters.h"
11 #include "nbtheory.h"
12 
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
size_t DSAConvertSignatureFormat(byte *buffer, size_t bufferSize, DSASignatureFormat toFormat, const byte *signature, size_t signatureLen, DSASignatureFormat fromFormat)
Converts between signature encoding formats.
Definition: dsa.cpp:15
void Encode(byte *output, size_t outputLen, Signedness sign=UNSIGNED) const
Encode in big-endian format.
Definition: integer.cpp:3270
DSASignatureFormat
DSA Signature Format.
Definition: dsa.h:17
Crypto++ native signature encoding format.
Definition: dsa.h:19
void OpenPGPDecode(const byte *input, size_t inputLen)
Decode from OpenPGP format.
Definition: integer.cpp:3345
BER Sequence Decoder.
Definition: asn.h:294
size_t OpenPGPEncode(byte *output, size_t bufferSize) const
Encode absolute value in OpenPGP format.
Definition: integer.cpp:3330
Copy input to a memory buffer.
Definition: filters.h:1000
signature encoding format used by Java and .Net
Definition: dsa.h:21
Multiple precision integer with arithmetic operations.
Definition: integer.h:31
Classes for the DSA signature algorithm.
String-based implementation of Store interface.
Definition: filters.h:1050
Classes and functions for working with ANS.1 objects.
Implementation of BufferedTransformation's attachment interface.
Classes and functions for number theoretic operations.
void DEREncode(BufferedTransformation &bt) const
Encode in DER format.
Definition: integer.cpp:3292
DER Sequence Encoder.
Definition: asn.h:304
void Decode(const byte *input, size_t inputLen, Signedness sign=UNSIGNED)
Decode from big-endian byte array.
Definition: integer.cpp:3218
void BERDecode(const byte *input, size_t inputLen)
Decode from BER format.
Definition: integer.cpp:3299
Crypto++ library namespace.
OpenPGP signature encoding format.
Definition: dsa.h:23
lword TotalPutLength()
Provides the number of bytes written to the Sink.
Definition: filters.h:1021