diff --git a/synapse/handlers/e2e_keys.py b/synapse/handlers/e2e_keys.py
index 39f4ec8e60..9081c3f64c 100644
--- a/synapse/handlers/e2e_keys.py
+++ b/synapse/handlers/e2e_keys.py
@@ -510,9 +510,18 @@ class E2eKeysHandler(object):
if not master_key:
raise SynapseError(400, "No master key available", Codes.MISSING_PARAM)
- master_key_id, master_verify_key = get_verify_key_from_cross_signing_key(
- master_key
- )
+ try:
+ master_key_id, master_verify_key = get_verify_key_from_cross_signing_key(
+ master_key
+ )
+ except ValueError:
+ if "master_key" in keys:
+ # the invalid key came from the request
+ raise SynapseError(400, "Invalid master key", Codes.INVALID_PARAM)
+ else:
+ # the invalid key came from the database
+ logger.error("Invalid master key found for user %s", user_id)
+ raise SynapseError(500, "Invalid master key")
# for the other cross-signing keys, make sure that they have valid
# signatures from the master key
@@ -539,9 +548,12 @@ class E2eKeysHandler(object):
yield self.store.set_e2e_cross_signing_key(
user_id, "self_signing", self_signing_key
)
- deviceids.append(
- get_verify_key_from_cross_signing_key(self_signing_key)[1].version
- )
+ try:
+ deviceids.append(
+ get_verify_key_from_cross_signing_key(self_signing_key)[1].version
+ )
+ except ValueError:
+ raise SynapseError(400, "Invalid self-signing key", Codes.INVALID_PARAM)
if "user_signing_key" in keys:
yield self.store.set_e2e_cross_signing_key(
user_id, "user_signing", user_signing_key
diff --git a/synapse/storage/schema/delta/56/hidden_devices.sql b/synapse/storage/schema/delta/56/hidden_devices.sql
index e1cd8cc2c1..67f8b20297 100644
--- a/synapse/storage/schema/delta/56/hidden_devices.sql
+++ b/synapse/storage/schema/delta/56/hidden_devices.sql
@@ -13,47 +13,6 @@
* limitations under the License.
*/
--- cross-signing keys
-CREATE TABLE IF NOT EXISTS e2e_cross_signing_keys (
- user_id TEXT NOT NULL,
- -- the type of cross-signing key (master, user_signing, or self_signing)
- keytype TEXT NOT NULL,
- -- the full key information, as a json-encoded dict
- keydata TEXT NOT NULL,
- -- time that the key was added
- added_ts BIGINT NOT NULL
-);
-
-CREATE UNIQUE INDEX e2e_cross_signing_keys_idx ON e2e_cross_signing_keys(user_id, keytype, added_ts);
-
--- cross-signing signatures
-CREATE TABLE IF NOT EXISTS e2e_cross_signing_signatures (
- -- user who did the signing
- user_id TEXT NOT NULL,
- -- key used to sign
- key_id TEXT NOT NULL,
- -- user who was signed
- target_user_id TEXT NOT NULL,
- -- device/key that was signed
- target_device_id TEXT NOT NULL,
- -- the actual signature
- signature TEXT NOT NULL
-);
-
-CREATE UNIQUE INDEX e2e_cross_signing_signatures_idx ON e2e_cross_signing_signatures(user_id, target_user_id, target_device_id);
-
--- stream of user signature updates
-CREATE TABLE IF NOT EXISTS user_signature_stream (
- -- uses the same stream ID as device list stream
- stream_id BIGINT NOT NULL,
- -- user who did the signing
- from_user_id TEXT NOT NULL,
- -- list of users who were signed, as a JSON array
- user_ids TEXT NOT NULL
-);
-
-CREATE UNIQUE INDEX user_signature_stream_idx ON user_signature_stream(stream_id);
-
-- device list needs to know which ones are "real" devices, and which ones are
-- just used to avoid collisions
ALTER TABLE devices ADD COLUMN hidden BOOLEAN DEFAULT FALSE;
diff --git a/synapse/storage/schema/delta/56/signing_keys.sql b/synapse/storage/schema/delta/56/signing_keys.sql
new file mode 100644
index 0000000000..6a9ef1782e
--- /dev/null
+++ b/synapse/storage/schema/delta/56/signing_keys.sql
@@ -0,0 +1,55 @@
+/* Copyright 2019 New Vector Ltd
+ *
+ * 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.
+ */
+
+-- cross-signing keys
+CREATE TABLE IF NOT EXISTS e2e_cross_signing_keys (
+ user_id TEXT NOT NULL,
+ -- the type of cross-signing key (master, user_signing, or self_signing)
+ keytype TEXT NOT NULL,
+ -- the full key information, as a json-encoded dict
+ keydata TEXT NOT NULL,
+ -- time that the key was added
+ added_ts BIGINT NOT NULL
+);
+
+CREATE UNIQUE INDEX e2e_cross_signing_keys_idx ON e2e_cross_signing_keys(user_id, keytype, added_ts);
+
+-- cross-signing signatures
+CREATE TABLE IF NOT EXISTS e2e_cross_signing_signatures (
+ -- user who did the signing
+ user_id TEXT NOT NULL,
+ -- key used to sign
+ key_id TEXT NOT NULL,
+ -- user who was signed
+ target_user_id TEXT NOT NULL,
+ -- device/key that was signed
+ target_device_id TEXT NOT NULL,
+ -- the actual signature
+ signature TEXT NOT NULL
+);
+
+CREATE UNIQUE INDEX e2e_cross_signing_signatures_idx ON e2e_cross_signing_signatures(user_id, target_user_id, target_device_id);
+
+-- stream of user signature updates
+CREATE TABLE IF NOT EXISTS user_signature_stream (
+ -- uses the same stream ID as device list stream
+ stream_id BIGINT NOT NULL,
+ -- user who did the signing
+ from_user_id TEXT NOT NULL,
+ -- list of users who were signed, as a JSON array
+ user_ids TEXT NOT NULL
+);
+
+CREATE UNIQUE INDEX user_signature_stream_idx ON user_signature_stream(stream_id);
diff --git a/synapse/types.py b/synapse/types.py
index 7a80471a0c..00bb0743ff 100644
--- a/synapse/types.py
+++ b/synapse/types.py
@@ -492,10 +492,10 @@ def get_verify_key_from_cross_signing_key(key_info):
"""
# make sure that exactly one key is provided
if "keys" not in key_info:
- raise SynapseError(400, "Invalid key")
+ raise ValueError("Invalid key")
keys = key_info["keys"]
if len(keys) != 1:
- raise SynapseError(400, "Invalid key")
+ raise ValueError("Invalid key")
# and return that one key
for key_id, key_data in keys.items():
return (key_id, decode_verify_key_bytes(key_id, decode_base64(key_data)))
|