LCOV - code coverage report
Current view: top level - src - eccryptoverify.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 21 23 91.3 %
Date: 2015-10-12 22:39:14 Functions: 3 3 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       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        7674 : int CompareBigEndian(const unsigned char *c1, size_t c1len, const unsigned char *c2, size_t c2len) {
      11       15582 :     while (c1len > c2len) {
      12        4071 :         if (*c1)
      13             :             return 1;
      14         234 :         c1++;
      15         234 :         c1len--;
      16             :     }
      17        3837 :     while (c2len > c1len) {
      18           1 :         if (*c2)
      19             :             return -1;
      20           0 :         c2++;
      21           0 :         c2len--;
      22             :     }
      23        3856 :     while (c1len > 0) {
      24        3856 :         if (*c1 > *c2)
      25             :             return 1;
      26        3847 :         if (*c2 > *c1)
      27             :             return -1;
      28          20 :         c1++;
      29          20 :         c2++;
      30          20 :         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        1812 : bool Check(const unsigned char *vch) {
      57        1812 :     return vch &&
      58        3624 :            CompareBigEndian(vch, 32, vchZero, 0) > 0 &&
      59        3624 :            CompareBigEndian(vch, 32, vchMaxModOrder, 32) <= 0;
      60             : }
      61             : 
      62        2025 : bool CheckSignatureElement(const unsigned char *vch, int len, bool half) {
      63        2025 :     return vch &&
      64        4050 :            CompareBigEndian(vch, len, vchZero, 0) > 0 &&
      65        4050 :            CompareBigEndian(vch, len, half ? vchMaxModHalfOrder : vchMaxModOrder, 32) <= 0;
      66             : }
      67             : 
      68             : } // namespace eccrypto

Generated by: LCOV version 1.11