aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/pk_pad/emsa_raw/emsa_raw.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/pk_pad/emsa_raw/emsa_raw.cpp')
-rw-r--r--src/lib/pk_pad/emsa_raw/emsa_raw.cpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/lib/pk_pad/emsa_raw/emsa_raw.cpp b/src/lib/pk_pad/emsa_raw/emsa_raw.cpp
new file mode 100644
index 000000000..cb0f99e9c
--- /dev/null
+++ b/src/lib/pk_pad/emsa_raw/emsa_raw.cpp
@@ -0,0 +1,68 @@
+/*
+* EMSA-Raw
+* (C) 1999-2007 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#include <botan/emsa_raw.h>
+
+namespace Botan {
+
+/*
+* EMSA-Raw Encode Operation
+*/
+void EMSA_Raw::update(const byte input[], size_t length)
+ {
+ message += std::make_pair(input, length);
+ }
+
+/*
+* Return the raw (unencoded) data
+*/
+secure_vector<byte> EMSA_Raw::raw_data()
+ {
+ secure_vector<byte> output;
+ std::swap(message, output);
+ return output;
+ }
+
+/*
+* EMSA-Raw Encode Operation
+*/
+secure_vector<byte> EMSA_Raw::encoding_of(const secure_vector<byte>& msg,
+ size_t,
+ RandomNumberGenerator&)
+ {
+ return msg;
+ }
+
+/*
+* EMSA-Raw Verify Operation
+*/
+bool EMSA_Raw::verify(const secure_vector<byte>& coded,
+ const secure_vector<byte>& raw,
+ size_t)
+ {
+ if(coded.size() == raw.size())
+ return (coded == raw);
+
+ if(coded.size() > raw.size())
+ return false;
+
+ // handle zero padding differences
+ const size_t leading_zeros_expected = raw.size() - coded.size();
+
+ bool same_modulo_leading_zeros = true;
+
+ for(size_t i = 0; i != leading_zeros_expected; ++i)
+ if(raw[i])
+ same_modulo_leading_zeros = false;
+
+ if(!same_mem(&coded[0], &raw[leading_zeros_expected], coded.size()))
+ same_modulo_leading_zeros = false;
+
+ return same_modulo_leading_zeros;
+ }
+
+}