github.com/grumpyhome/grumpy@v0.3.1-0.20201208125205-7b775405bdf1/grumpy-runtime-src/third_party/pypy/_sha256.py (about)

     1  import _struct as struct
     2  
     3  SHA_BLOCKSIZE = 64
     4  SHA_DIGESTSIZE = 32
     5  
     6  
     7  def new_shaobject():
     8      return {
     9          'digest': [0]*8,
    10          'count_lo': 0,
    11          'count_hi': 0,
    12          'data': [0]* SHA_BLOCKSIZE,
    13          'local': 0,
    14          'digestsize': 0
    15      }
    16  
    17  ROR = lambda x, y: (((x & 0xffffffff) >> (y & 31)) | (x << (32 - (y & 31)))) & 0xffffffff
    18  Ch = lambda x, y, z: (z ^ (x & (y ^ z)))
    19  Maj = lambda x, y, z: (((x | y) & z) | (x & y))
    20  S = lambda x, n: ROR(x, n)
    21  R = lambda x, n: (x & 0xffffffff) >> n
    22  Sigma0 = lambda x: (S(x, 2) ^ S(x, 13) ^ S(x, 22))
    23  Sigma1 = lambda x: (S(x, 6) ^ S(x, 11) ^ S(x, 25))
    24  Gamma0 = lambda x: (S(x, 7) ^ S(x, 18) ^ R(x, 3))
    25  Gamma1 = lambda x: (S(x, 17) ^ S(x, 19) ^ R(x, 10))
    26  
    27  def sha_transform(sha_info):
    28      W = []
    29  
    30      d = sha_info['data']
    31      for i in xrange(0,16):
    32          W.append( (d[4*i]<<24) + (d[4*i+1]<<16) + (d[4*i+2]<<8) + d[4*i+3])
    33  
    34      for i in xrange(16,64):
    35          W.append( (Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]) & 0xffffffff )
    36  
    37      ss = sha_info['digest'][:]
    38  
    39      def RND(a,b,c,d,e,f,g,h,i,ki):
    40          t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i];
    41          t1 = Sigma0(a) + Maj(a, b, c);
    42          d += t0;
    43          h  = t0 + t1;
    44          return d & 0xffffffff, h & 0xffffffff
    45  
    46      ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],0,0x428a2f98);
    47      ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],1,0x71374491);
    48      ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],2,0xb5c0fbcf);
    49      ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],3,0xe9b5dba5);
    50      ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],4,0x3956c25b);
    51      ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],5,0x59f111f1);
    52      ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],6,0x923f82a4);
    53      ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],7,0xab1c5ed5);
    54      ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],8,0xd807aa98);
    55      ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],9,0x12835b01);
    56      ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],10,0x243185be);
    57      ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],11,0x550c7dc3);
    58      ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],12,0x72be5d74);
    59      ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],13,0x80deb1fe);
    60      ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],14,0x9bdc06a7);
    61      ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],15,0xc19bf174);
    62      ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],16,0xe49b69c1);
    63      ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],17,0xefbe4786);
    64      ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],18,0x0fc19dc6);
    65      ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],19,0x240ca1cc);
    66      ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],20,0x2de92c6f);
    67      ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],21,0x4a7484aa);
    68      ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],22,0x5cb0a9dc);
    69      ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],23,0x76f988da);
    70      ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],24,0x983e5152);
    71      ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],25,0xa831c66d);
    72      ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],26,0xb00327c8);
    73      ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],27,0xbf597fc7);
    74      ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],28,0xc6e00bf3);
    75      ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],29,0xd5a79147);
    76      ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],30,0x06ca6351);
    77      ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],31,0x14292967);
    78      ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],32,0x27b70a85);
    79      ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],33,0x2e1b2138);
    80      ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],34,0x4d2c6dfc);
    81      ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],35,0x53380d13);
    82      ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],36,0x650a7354);
    83      ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],37,0x766a0abb);
    84      ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],38,0x81c2c92e);
    85      ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],39,0x92722c85);
    86      ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],40,0xa2bfe8a1);
    87      ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],41,0xa81a664b);
    88      ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],42,0xc24b8b70);
    89      ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],43,0xc76c51a3);
    90      ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],44,0xd192e819);
    91      ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],45,0xd6990624);
    92      ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],46,0xf40e3585);
    93      ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],47,0x106aa070);
    94      ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],48,0x19a4c116);
    95      ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],49,0x1e376c08);
    96      ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],50,0x2748774c);
    97      ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],51,0x34b0bcb5);
    98      ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],52,0x391c0cb3);
    99      ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],53,0x4ed8aa4a);
   100      ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],54,0x5b9cca4f);
   101      ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],55,0x682e6ff3);
   102      ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],56,0x748f82ee);
   103      ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],57,0x78a5636f);
   104      ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],58,0x84c87814);
   105      ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],59,0x8cc70208);
   106      ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],60,0x90befffa);
   107      ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],61,0xa4506ceb);
   108      ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],62,0xbef9a3f7);
   109      ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],63,0xc67178f2);
   110  
   111      dig = []
   112      for i, x in enumerate(sha_info['digest']):
   113          dig.append( (x + ss[i]) & 0xffffffff )
   114      sha_info['digest'] = dig
   115  
   116  def sha_init():
   117      sha_info = new_shaobject()
   118      sha_info['digest'] = [0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19]
   119      sha_info['count_lo'] = 0
   120      sha_info['count_hi'] = 0
   121      sha_info['local'] = 0
   122      sha_info['digestsize'] = 32
   123      return sha_info
   124  
   125  def sha224_init():
   126      sha_info = new_shaobject()
   127      sha_info['digest'] = [0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4]
   128      sha_info['count_lo'] = 0
   129      sha_info['count_hi'] = 0
   130      sha_info['local'] = 0
   131      sha_info['digestsize'] = 28
   132      return sha_info
   133  
   134  def getbuf(s):
   135      if isinstance(s, str):
   136          return s
   137      elif isinstance(s, unicode):
   138          return str(s)
   139      else:
   140          return buffer(s)
   141  
   142  def sha_update(sha_info, buffer):
   143      count = len(buffer)
   144      buffer_idx = 0
   145      clo = (sha_info['count_lo'] + (count << 3)) & 0xffffffff
   146      if clo < sha_info['count_lo']:
   147          sha_info['count_hi'] += 1
   148      sha_info['count_lo'] = clo
   149  
   150      sha_info['count_hi'] += (count >> 29)
   151  
   152      if sha_info['local']:
   153          i = SHA_BLOCKSIZE - sha_info['local']
   154          if i > count:
   155              i = count
   156  
   157          # copy buffer
   158          for x in enumerate(buffer[buffer_idx:buffer_idx+i]):
   159              sha_info['data'][sha_info['local']+x[0]] = struct.unpack('B', x[1])[0]
   160  
   161          count -= i
   162          buffer_idx += i
   163  
   164          sha_info['local'] += i
   165          if sha_info['local'] == SHA_BLOCKSIZE:
   166              sha_transform(sha_info)
   167              sha_info['local'] = 0
   168          else:
   169              return
   170  
   171      while count >= SHA_BLOCKSIZE:
   172          # copy buffer
   173          sha_info['data'] = [struct.unpack('B',c)[0] for c in buffer[buffer_idx:buffer_idx + SHA_BLOCKSIZE]]
   174          count -= SHA_BLOCKSIZE
   175          buffer_idx += SHA_BLOCKSIZE
   176          sha_transform(sha_info)
   177  
   178  
   179      # copy buffer
   180      pos = sha_info['local']
   181      sha_info['data'][pos:pos+count] = [struct.unpack('B',c)[0] for c in buffer[buffer_idx:buffer_idx + count]]
   182      sha_info['local'] = count
   183  
   184  def sha_final(sha_info):
   185      lo_bit_count = sha_info['count_lo']
   186      hi_bit_count = sha_info['count_hi']
   187      count = (lo_bit_count >> 3) & 0x3f
   188      sha_info['data'][count] = 0x80;
   189      count += 1
   190      if count > SHA_BLOCKSIZE - 8:
   191          # zero the bytes in data after the count
   192          sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count))
   193          sha_transform(sha_info)
   194          # zero bytes in data
   195          sha_info['data'] = [0] * SHA_BLOCKSIZE
   196      else:
   197          sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count))
   198  
   199      sha_info['data'][56] = (hi_bit_count >> 24) & 0xff
   200      sha_info['data'][57] = (hi_bit_count >> 16) & 0xff
   201      sha_info['data'][58] = (hi_bit_count >>  8) & 0xff
   202      sha_info['data'][59] = (hi_bit_count >>  0) & 0xff
   203      sha_info['data'][60] = (lo_bit_count >> 24) & 0xff
   204      sha_info['data'][61] = (lo_bit_count >> 16) & 0xff
   205      sha_info['data'][62] = (lo_bit_count >>  8) & 0xff
   206      sha_info['data'][63] = (lo_bit_count >>  0) & 0xff
   207  
   208      sha_transform(sha_info)
   209  
   210      dig = []
   211      for i in sha_info['digest']:
   212          dig.extend([ ((i>>24) & 0xff), ((i>>16) & 0xff), ((i>>8) & 0xff), (i & 0xff) ])
   213      return ''.join([chr(i) for i in dig])
   214  
   215  class sha256(object):
   216      digest_size = digestsize = SHA_DIGESTSIZE
   217      block_size = SHA_BLOCKSIZE
   218  
   219      def __init__(self, s=None):
   220          self._sha = sha_init()
   221          if s:
   222              sha_update(self._sha, getbuf(s))
   223  
   224      def update(self, s):
   225          sha_update(self._sha, getbuf(s))
   226  
   227      def digest(self):
   228          return sha_final(self._sha.copy())[:self._sha['digestsize']]
   229  
   230      def hexdigest(self):
   231          return ''.join([('0%x' % ord(i))[-2:] for i in self.digest()])
   232  
   233      def copy(self):
   234          new = sha256.__new__(sha256)
   235          new._sha = self._sha.copy()
   236          return new
   237  
   238  class sha224(sha256):
   239      digest_size = digestsize = 28
   240  
   241      def __init__(self, s=None):
   242          self._sha = sha224_init()
   243          if s:
   244              sha_update(self._sha, getbuf(s))
   245  
   246      def copy(self):
   247          new = sha224.__new__(sha224)
   248          new._sha = self._sha.copy()
   249          return new
   250  
   251  def test():
   252      a_str = "just a test string"
   253  
   254      assert 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' == sha256().hexdigest()
   255      assert 'd7b553c6f09ac85d142415f857c5310f3bbbe7cdd787cce4b985acedd585266f' == sha256(a_str).hexdigest()
   256      assert '8113ebf33c97daa9998762aacafe750c7cefc2b2f173c90c59663a57fe626f21' == sha256(a_str*7).hexdigest()
   257  
   258      s = sha256(a_str)
   259      s.update(a_str)
   260      assert '03d9963e05a094593190b6fc794cb1a3e1ac7d7883f0b5855268afeccc70d461' == s.hexdigest()
   261  
   262  if __name__ == "__main__":
   263      test()
   264  
   265