1 /**
2 * EMSA-Raw
3 * 
4 * Copyright:
5 * (C) 1999-2007 Jack Lloyd
6 * (C) 2014-2015 Etienne Cimon
7 *
8 * License:
9 * Botan is released under the Simplified BSD License (see LICENSE.md)
10 */
11 module botan.pk_pad.emsa_raw;
12 
13 import botan.constants;
14 static if (BOTAN_HAS_EMSA_RAW):
15 import botan.pk_pad.emsa;
16 import botan.utils.types;
17 import botan.utils.mem_ops;
18 import std.algorithm : swap;
19 
20 /**
21 * EMSA-Raw - sign inputs directly
22 * Don't use this unless you know what you are doing.
23 */
24 final class EMSARaw : EMSA
25 {
26 public:
27     /*
28     * EMSA-Raw Encode Operation
29     */
30     override void update(const(ubyte)* input, size_t length)
31     {
32         m_message ~= input[0 .. length];
33     }
34 
35     /*
36     * Return the raw (unencoded) data
37     */
38     override SecureVector!ubyte rawData()
39     {
40         SecureVector!ubyte output;
41         swap(m_message, output);
42         return output.move;
43     }
44 
45     /*
46     * EMSA-Raw Encode Operation
47     */
48     SecureVector!ubyte encodingOf(const ref SecureVector!ubyte msg,
49                                   size_t,
50                                   RandomNumberGenerator)
51     {
52         return msg.clone;
53     }
54 
55     /*
56     * EMSA-Raw Verify Operation
57     */
58     bool verify(const ref SecureVector!ubyte coded,
59                 const ref SecureVector!ubyte raw,
60                 size_t)
61     {
62         if (coded.length == raw.length)
63             return (coded == raw);
64         
65         if (coded.length > raw.length)
66             return false;
67         
68         // handle zero padding differences
69         const size_t leading_zeros_expected = raw.length - coded.length;
70         
71         bool same_modulo_leading_zeros = true;
72         
73         foreach (size_t i; 0 .. leading_zeros_expected)
74             if (raw[i])
75                 same_modulo_leading_zeros = false;
76         
77         if (!sameMem(coded.ptr, &raw[leading_zeros_expected], coded.length))
78             same_modulo_leading_zeros = false;
79         
80         return same_modulo_leading_zeros;
81     }
82 
83     SecureVector!ubyte m_message;
84 }