Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

#!/usr/bin/env python 

# -*- coding: utf-8 -*- 

 

############################################################################### 

#  Copyright 2013 Kitware Inc. 

# 

#  Licensed under the Apache License, Version 2.0 ( the "License" ); 

#  you may not use this file except in compliance with the License. 

#  You may obtain a copy of the License at 

# 

#    http://www.apache.org/licenses/LICENSE-2.0 

# 

#  Unless required by applicable law or agreed to in writing, software 

#  distributed under the License is distributed on an "AS IS" BASIS, 

#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 

#  See the License for the specific language governing permissions and 

#  limitations under the License. 

############################################################################### 

 

# Utility for saving and restoring the internal state of a sha512 object 

# so that checksums can be streamed without having to remain in memory. 

# Taken and adpated from http://code.activestate.com/recipes/ 

# 578479-save-and-restore-sha-512-internal-state/ 

 

from hashlib import sha512 

import ctypes 

import binascii 

 

POFFSET = 6 

STATESIZE = 216 

 

 

def serialize(sha512Object): 

    """ 

    Serializes the internal state of the sha512 object passed in. Calling 

    restore() on the serialized value afterward will return an equivalent 

    sha512 object to the one passed. 

    :param sha512Object: The sha512 object to serialize. 

    :type sha512Object: sha512 

    :returns: A binary string representing the serialized state. 

    """ 

    datap = ctypes.cast( 

        ctypes.cast(id(sha512Object), ctypes.POINTER(ctypes.c_voidp))[POFFSET], 

        ctypes.POINTER(ctypes.c_char)) 

    assert datap 

 

    return datap[:STATESIZE] 

 

 

def restore(data): 

    """ 

    Unserializes a sha512 object from a binary string created by the 

    serialize() method in this module. 

    :param data: The serialized state. 

    :type data: binary string 

    :returns: A sha512 object in the same state as the one that serialize() 

              was called on. 

    """ 

    checksum = sha512() 

    datap = ctypes.cast( 

        ctypes.cast(id(checksum), ctypes.POINTER(ctypes.c_voidp))[POFFSET], 

        ctypes.POINTER(ctypes.c_char)) 

    assert datap 

    assert datap[:8] == '\x08\xc9\xbc\xf3g\xe6\tj'  # first sha512 word 

 

    for i, byte in enumerate(data): 

        assert i < STATESIZE 

        datap[i] = byte 

    assert i + 1 == STATESIZE 

 

    return checksum 

 

 

serializeHex = lambda o: binascii.b2a_hex(serialize(o)) 

restoreHex = lambda d: restore(binascii.a2b_hex(d))