]> Git Repo - VerusCoin.git/blob - src/eccryptoverify.cpp
test
[VerusCoin.git] / src / eccryptoverify.cpp
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2014 The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
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
This page took 0.028328 seconds and 4 git commands to generate.