Bump version number
[platform/upstream/libsecret.git] / libsecret / tests / mock / dh.py
1
2 # WARNING: This is for use in mock objects during testing, and NOT
3 # cryptographically secure or performant.
4
5 #
6 # Copyright 2011 Stef Walter
7 #
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU Lesser General Public License as published
10 # by the Free Software Foundation; either version 2 of the licence or (at
11 # your option) any later version.
12 #
13 # See the included COPYING file for more information.
14 #
15
16 #
17 # Some utility functions from tlslite which is public domain
18 # Written by Trevor Perrin <trevp at trevp.net>
19 # http://trevp.net/tlslite/
20 #
21
22 import math
23 import random
24
25 PRIME = '\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC9\x0F\xDA\xA2\x21\x68\xC2\x34\xC4\xC6\x62\x8B\x80\xDC\x1C\xD1' \
26         '\x29\x02\x4E\x08\x8A\x67\xCC\x74\x02\x0B\xBE\xA6\x3B\x13\x9B\x22\x51\x4A\x08\x79\x8E\x34\x04\xDD' \
27         '\xEF\x95\x19\xB3\xCD\x3A\x43\x1B\x30\x2B\x0A\x6D\xF2\x5F\x14\x37\x4F\xE1\x35\x6D\x6D\x51\xC2\x45' \
28         '\xE4\x85\xB5\x76\x62\x5E\x7E\xC6\xF4\x4C\x42\xE9\xA6\x37\xED\x6B\x0B\xFF\x5C\xB6\xF4\x06\xB7\xED' \
29         '\xEE\x38\x6B\xFB\x5A\x89\x9F\xA5\xAE\x9F\x24\x11\x7C\x4B\x1F\xE6\x49\x28\x66\x51\xEC\xE6\x53\x81' \
30         '\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF'
31
32 def num_bits(number):
33         if number == 0:
34                 return 0
35         s = "%x" % number
36         return ((len(s)-1)*4) + \
37             {'0':0, '1':1, '2':2, '3':2,
38              '4':3, '5':3, '6':3, '7':3,
39              '8':4, '9':4, 'a':4, 'b':4,
40              'c':4, 'd':4, 'e':4, 'f':4,
41             }[s[0]]
42
43 def num_bytes(number):
44         if number == 0:
45                 return 0
46         bits = num_bits(number)
47         return int(math.ceil(bits / 8.0))
48
49 def bytes_to_number(data):
50         number = 0L
51         multiplier = 1L
52         for count in range(len(data) - 1, -1, -1):
53                 number += multiplier * ord(data[count])
54                 multiplier *= 256
55         return number
56
57 def number_to_bytes(number):
58         n_data = num_bytes(number)
59         data = ['' for i in range(0, n_data)]
60         for count in range(n_data - 1, -1, -1):
61                 data[count] = chr(number % 256)
62                 number >>= 8
63         return "".join(data)
64
65 def generate_pair():
66         prime = bytes_to_number (PRIME)
67         base = 2
68         # print "mock prime: ", hex(prime)
69         # print " mock base: ", hex(base)
70         bits = num_bits(prime)
71         privat = 0
72         while privat == 0:
73                 privat = random.getrandbits(bits - 1)
74         publi = pow(base, privat, prime)
75         return (privat, publi)
76
77 def derive_key(privat, peer):
78         prime = bytes_to_number (PRIME)
79         key = pow(peer, privat, prime)
80         # print " mock ikm2: ", hex(key)
81         return number_to_bytes(key)