Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.2 KiB

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