Add basic openpgp key handling to Key Manager
[leap_pycommon.git] / src / leap / common / keymanager / keys.py
1 # -*- coding: utf-8 -*-
2 # keys.py
3 # Copyright (C) 2013 LEAP
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18
19 """
20 Abstact key type and wrapper representations.
21 """
22
23
24 from abc import ABCMeta, abstractmethod
25
26
27 class EncryptionKey(object):
28     """
29     Abstract class for encryption keys.
30
31     A key is "validated" if the nicknym agent has bound the user address to a
32     public key. Nicknym supports three different levels of key validation:
33
34     * Level 3 - path trusted: A path of cryptographic signatures can be traced
35       from a trusted key to the key under evaluation. By default, only the
36       provider key from the user's provider is a "trusted key".
37     * level 2 - provider signed: The key has been signed by a provider key for
38       the same domain, but the provider key is not validated using a trust
39       path (i.e. it is only registered)
40     * level 1 - registered: The key has been encountered and saved, it has no
41       signatures (that are meaningful to the nicknym agent).
42     """
43
44     __metaclass__ = ABCMeta
45
46     def __init__(self, address, key_id=None, fingerprint=None,
47                  key_data=None, length=None, expiry_date=None,
48                  validation=None, first_seen_at=None,
49                  last_audited_at=None):
50         self.address = address
51         self.key_id = key_id
52         self.fingerprint = fingerprint
53         self.key_data = key_data
54         self.length = length
55         self.expiry_date = expiry_date
56         self.validation = validation
57         self.first_seen_at = first_seen_at
58         self.last_audited_at = last_audited_at
59
60     def get_json(self):
61         """
62         Return a JSON string describing this key.
63
64         @return: The JSON string describing this key.
65         @rtype: str
66         """
67         return json.dumps({
68             'address': self.address,
69             'type': str(self.__type__),
70             'key_id': self.key_id,
71             'fingerprint': self.fingerprint,
72             'key_data': self.key_data,
73             'length': self.length,
74             'expiry_date': self.expiry_date,
75             'validation': self.validation,
76             'first_seen_at': self.first_seen_at,
77             'last_audited_at': self.last_audited_at,
78         })
79
80
81 #
82 # Key wrappers
83 #
84
85 class KeyTypeWrapper(object):
86     """
87     Abstract class for Key Type Wrappers.
88
89     A wrapper for a certain key type should know how to get and put keys in
90     local storage using Soledad and also how to generate new keys.
91     """
92
93     __metaclass__ = ABCMeta
94
95     @abstractmethod
96     def get_key(self, address):
97         """
98         Get key from local storage.
99
100         @param address: The address bound to the key.
101         @type address: str
102
103         @return: The key bound to C{address}.
104         @rtype: EncryptionKey
105         @raise KeyNotFound: If the key was not found on local storage.
106         """
107
108     @abstractmethod
109     def put_key(self, key):
110         """
111         Put a key in local storage.
112
113         @param key: The key to be stored.
114         @type key: EncryptionKey
115         """
116
117     @abstractmethod
118     def gen_key(self, address):
119         """
120         Generate a new key.
121
122         @param address: The address bound to the key.
123         @type address: str
124         @return: The key bound to C{address}.
125         @rtype: EncryptionKey
126         """
127