]>
Commit | Line | Data |
---|---|---|
b4347f60 | 1 | // Copyright (c) 2009-2010 Satoshi Nakamoto |
f914f1a7 | 2 | // Copyright (c) 2009-2014 The Bitcoin Core developers |
b4347f60 PK |
3 | // Distributed under the MIT software license, see the accompanying |
4 | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | |
5 | ||
900078ae CF |
6 | #include "eccryptoverify.h" |
7 | ||
8 | namespace { | |
9 | ||
10 | int CompareBigEndian(const unsigned char *c1, size_t c1len, const unsigned char *c2, size_t c2len) { | |
11 | while (c1len > c2len) { | |
12 | if (*c1) | |
13 | return 1; | |
14 | c1++; | |
15 | c1len--; | |
16 | } | |
17 | while (c2len > c1len) { | |
18 | if (*c2) | |
19 | return -1; | |
20 | c2++; | |
21 | c2len--; | |
22 | } | |
23 | while (c1len > 0) { | |
24 | if (*c1 > *c2) | |
25 | return 1; | |
26 | if (*c2 > *c1) | |
27 | return -1; | |
28 | c1++; | |
29 | c2++; | |
30 | c1len--; | |
31 | } | |
32 | return 0; | |
33 | } | |
34 | ||
35 | /** Order of secp256k1's generator minus 1. */ | |
36 | const unsigned char vchMaxModOrder[32] = { | |
37 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, | |
38 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, | |
39 | 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, | |
40 | 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40 | |
41 | }; | |
42 | ||
43 | /** Half of the order of secp256k1's generator minus 1. */ | |
44 | const unsigned char vchMaxModHalfOrder[32] = { | |
45 | 0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, | |
46 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, | |
47 | 0x5D,0x57,0x6E,0x73,0x57,0xA4,0x50,0x1D, | |
48 | 0xDF,0xE9,0x2F,0x46,0x68,0x1B,0x20,0xA0 | |
49 | }; | |
50 | ||
51 | const unsigned char vchZero[1] = {0}; | |
52 | } // anon namespace | |
53 | ||
54 | namespace eccrypto { | |
55 | ||
56 | bool Check(const unsigned char *vch) { | |
57 | return vch && | |
58 | CompareBigEndian(vch, 32, vchZero, 0) > 0 && | |
59 | CompareBigEndian(vch, 32, vchMaxModOrder, 32) <= 0; | |
60 | } | |
61 | ||
62 | bool CheckSignatureElement(const unsigned char *vch, int len, bool half) { | |
63 | return vch && | |
64 | CompareBigEndian(vch, len, vchZero, 0) > 0 && | |
65 | CompareBigEndian(vch, len, half ? vchMaxModHalfOrder : vchMaxModOrder, 32) <= 0; | |
66 | } | |
67 | ||
68 | } // namespace eccrypto |