|
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* vim: set sw=2 ts=8 et ft=cpp: */ |
|
3 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
4 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
6 |
|
7 #ifndef mozilla_ipc_KeyStore_h |
|
8 #define mozilla_ipc_KeyStore_h 1 |
|
9 |
|
10 #include "mozilla/ipc/UnixSocket.h" |
|
11 #include <sys/socket.h> |
|
12 #include <sys/un.h> |
|
13 |
|
14 #include "cert.h" |
|
15 |
|
16 namespace mozilla { |
|
17 namespace ipc { |
|
18 |
|
19 enum ResponseCode { |
|
20 SUCCESS = 1, |
|
21 LOCKED = 2, |
|
22 UNINITIALIZED = 3, |
|
23 SYSTEM_ERROR = 4, |
|
24 PROTOCOL_ERROR = 5, |
|
25 PERMISSION_DENIED = 6, |
|
26 KEY_NOT_FOUND = 7, |
|
27 VALUE_CORRUPTED = 8, |
|
28 UNDEFINED_ACTION = 9, |
|
29 WRONG_PASSWORD_0 = 10, |
|
30 WRONG_PASSWORD_1 = 11, |
|
31 WRONG_PASSWORD_2 = 12, |
|
32 WRONG_PASSWORD_3 = 13, // MAX_RETRY = 4 |
|
33 NO_RESPONSE |
|
34 }; |
|
35 |
|
36 static const int MAX_PARAM = 2; |
|
37 static const int KEY_SIZE = ((NAME_MAX - 15) / 2); |
|
38 static const int VALUE_SIZE = 32768; |
|
39 static const int PASSWORD_SIZE = VALUE_SIZE; |
|
40 |
|
41 static const char *CA_BEGIN = "-----BEGIN ", |
|
42 *CA_END = "-----END ", |
|
43 *CA_TAILER = "-----\n"; |
|
44 static const int CA_LINE_SIZE = 64; |
|
45 |
|
46 struct ProtocolCommand { |
|
47 int8_t command; |
|
48 int paramNum; |
|
49 }; |
|
50 |
|
51 static const struct ProtocolCommand commands[] = { |
|
52 {'g', 1}, // Get CA, command "g CERT_NAME" |
|
53 { 0, 0} |
|
54 }; |
|
55 |
|
56 struct ProtocolParam{ |
|
57 uint length; |
|
58 int8_t data[VALUE_SIZE]; |
|
59 }; |
|
60 |
|
61 typedef enum { |
|
62 STATE_IDLE, |
|
63 STATE_READ_PARAM_LEN, |
|
64 STATE_READ_PARAM_DATA, |
|
65 STATE_PROCESSING |
|
66 } ProtocolHandlerState; |
|
67 |
|
68 class KeyStoreConnector : public mozilla::ipc::UnixSocketConnector |
|
69 { |
|
70 public: |
|
71 KeyStoreConnector() |
|
72 {} |
|
73 |
|
74 virtual ~KeyStoreConnector() |
|
75 {} |
|
76 |
|
77 virtual int Create(); |
|
78 virtual bool CreateAddr(bool aIsServer, |
|
79 socklen_t& aAddrSize, |
|
80 sockaddr_any& aAddr, |
|
81 const char* aAddress); |
|
82 virtual bool SetUp(int aFd); |
|
83 virtual bool SetUpListenSocket(int aFd); |
|
84 virtual void GetSocketAddr(const sockaddr_any& aAddr, |
|
85 nsAString& aAddrStr); |
|
86 }; |
|
87 |
|
88 class KeyStore : public mozilla::ipc::UnixSocketConsumer |
|
89 { |
|
90 public: |
|
91 KeyStore(); |
|
92 virtual ~KeyStore() {} |
|
93 |
|
94 void Shutdown(); |
|
95 |
|
96 private: |
|
97 virtual void ReceiveSocketData(nsAutoPtr<UnixSocketRawData>& aMessage); |
|
98 |
|
99 virtual void OnConnectSuccess(); |
|
100 virtual void OnConnectError(); |
|
101 virtual void OnDisconnect(); |
|
102 |
|
103 private: |
|
104 struct { |
|
105 ProtocolHandlerState state; |
|
106 uint8_t command; |
|
107 struct ProtocolParam param[MAX_PARAM]; |
|
108 int paramCount; |
|
109 const struct ProtocolCommand *commandPattern; |
|
110 } mHandlerInfo; |
|
111 void ResetHandlerInfo(); |
|
112 void Listen(); |
|
113 |
|
114 void FormatCaData(const uint8_t *caData, int caDataLength, const char *name, |
|
115 const uint8_t **formatData, int &formatDataLength); |
|
116 |
|
117 bool CheckSize(UnixSocketRawData *aMessage, size_t aExpectSize); |
|
118 bool ReadCommand(UnixSocketRawData *aMessage); |
|
119 bool ReadLength(UnixSocketRawData *aMessage); |
|
120 bool ReadData(UnixSocketRawData *aMessage); |
|
121 void SendResponse(ResponseCode response); |
|
122 void SendData(const uint8_t *data, int length); |
|
123 |
|
124 bool mShutdown; |
|
125 |
|
126 CERTCertDBHandle *certdb; |
|
127 }; |
|
128 |
|
129 } // namespace ipc |
|
130 } // namespace mozilla |
|
131 |
|
132 #endif // mozilla_ipc_KeyStore_h |