001/** 002 * 003 * Copyright 2018 Paul Schaub. 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.jivesoftware.smackx.ox.store.abstr; 018 019import java.io.IOException; 020import java.security.InvalidAlgorithmParameterException; 021import java.security.NoSuchAlgorithmException; 022import java.security.NoSuchProviderException; 023import java.util.Date; 024import java.util.HashMap; 025import java.util.Map; 026 027import org.jivesoftware.smack.util.Objects; 028 029import org.jivesoftware.smackx.ox.OpenPgpContact; 030import org.jivesoftware.smackx.ox.callback.SecretKeyPassphraseCallback; 031import org.jivesoftware.smackx.ox.exception.MissingUserIdOnKeyException; 032import org.jivesoftware.smackx.ox.store.definition.OpenPgpKeyStore; 033import org.jivesoftware.smackx.ox.store.definition.OpenPgpMetadataStore; 034import org.jivesoftware.smackx.ox.store.definition.OpenPgpStore; 035import org.jivesoftware.smackx.ox.store.definition.OpenPgpTrustStore; 036 037import org.bouncycastle.openpgp.PGPException; 038import org.bouncycastle.openpgp.PGPPublicKeyRing; 039import org.bouncycastle.openpgp.PGPPublicKeyRingCollection; 040import org.bouncycastle.openpgp.PGPSecretKeyRing; 041import org.bouncycastle.openpgp.PGPSecretKeyRingCollection; 042import org.jxmpp.jid.BareJid; 043import org.pgpainless.key.OpenPgpV4Fingerprint; 044import org.pgpainless.key.collection.PGPKeyRing; 045import org.pgpainless.key.protection.SecretKeyRingProtector; 046import org.pgpainless.key.protection.UnprotectedKeysProtector; 047 048public abstract class AbstractOpenPgpStore implements OpenPgpStore { 049 050 protected final OpenPgpKeyStore keyStore; 051 protected final OpenPgpMetadataStore metadataStore; 052 protected final OpenPgpTrustStore trustStore; 053 054 protected SecretKeyPassphraseCallback secretKeyPassphraseCallback; 055 protected SecretKeyRingProtector unlocker = new UnprotectedKeysProtector(); 056 protected final Map<BareJid, OpenPgpContact> contacts = new HashMap<>(); 057 058 @Override 059 public void deletePublicKeyRing(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException, PGPException { 060 keyStore.deletePublicKeyRing(owner, fingerprint); 061 } 062 063 @Override 064 public void deleteSecretKeyRing(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException, PGPException { 065 keyStore.deleteSecretKeyRing(owner, fingerprint); 066 } 067 068 protected AbstractOpenPgpStore(OpenPgpKeyStore keyStore, 069 OpenPgpMetadataStore metadataStore, 070 OpenPgpTrustStore trustStore) { 071 this.keyStore = Objects.requireNonNull(keyStore); 072 this.metadataStore = Objects.requireNonNull(metadataStore); 073 this.trustStore = Objects.requireNonNull(trustStore); 074 } 075 076 @Override 077 public OpenPgpContact getOpenPgpContact(BareJid jid) { 078 OpenPgpContact contact = contacts.get(jid); 079 if (contact == null) { 080 contact = new OpenPgpContact(jid, this); 081 contacts.put(jid, contact); 082 } 083 return contact; 084 } 085 086 @Override 087 public void setKeyRingProtector(SecretKeyRingProtector protector) { 088 this.unlocker = protector; 089 } 090 091 @Override 092 public SecretKeyRingProtector getKeyRingProtector() { 093 return unlocker; 094 } 095 096 @Override 097 public void setSecretKeyPassphraseCallback(SecretKeyPassphraseCallback callback) { 098 this.secretKeyPassphraseCallback = callback; 099 } 100 101 /* 102 OpenPgpKeyStore 103 */ 104 105 @Override 106 public PGPPublicKeyRingCollection getPublicKeysOf(BareJid owner) throws IOException, PGPException { 107 return keyStore.getPublicKeysOf(owner); 108 } 109 110 @Override 111 public PGPSecretKeyRingCollection getSecretKeysOf(BareJid owner) throws IOException, PGPException { 112 return keyStore.getSecretKeysOf(owner); 113 } 114 115 @Override 116 public PGPPublicKeyRing getPublicKeyRing(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException, PGPException { 117 return keyStore.getPublicKeyRing(owner, fingerprint); 118 } 119 120 @Override 121 public PGPSecretKeyRing getSecretKeyRing(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException, PGPException { 122 return keyStore.getSecretKeyRing(owner, fingerprint); 123 } 124 125 @Override 126 public PGPKeyRing generateKeyRing(BareJid owner) throws PGPException, NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException { 127 return keyStore.generateKeyRing(owner); 128 } 129 130 @Override 131 public void importSecretKey(BareJid owner, PGPSecretKeyRing secretKeys) throws IOException, PGPException, MissingUserIdOnKeyException { 132 keyStore.importSecretKey(owner, secretKeys); 133 } 134 135 @Override 136 public void importPublicKey(BareJid owner, PGPPublicKeyRing publicKeys) throws IOException, PGPException, MissingUserIdOnKeyException { 137 keyStore.importPublicKey(owner, publicKeys); 138 } 139 140 @Override 141 public Map<OpenPgpV4Fingerprint, Date> getPublicKeyFetchDates(BareJid contact) throws IOException { 142 return keyStore.getPublicKeyFetchDates(contact); 143 } 144 145 @Override 146 public void setPublicKeyFetchDates(BareJid contact, Map<OpenPgpV4Fingerprint, Date> dates) throws IOException { 147 keyStore.setPublicKeyFetchDates(contact, dates); 148 } 149 150 /* 151 OpenPgpMetadataStore 152 */ 153 154 @Override 155 public Map<OpenPgpV4Fingerprint, Date> getAnnouncedFingerprintsOf(BareJid contact) throws IOException { 156 return metadataStore.getAnnouncedFingerprintsOf(contact); 157 } 158 159 @Override 160 public void setAnnouncedFingerprintsOf(BareJid contact, Map<OpenPgpV4Fingerprint, Date> data) throws IOException { 161 metadataStore.setAnnouncedFingerprintsOf(contact, data); 162 } 163 164 /* 165 OpenPgpTrustStore 166 */ 167 168 @Override 169 public Trust getTrust(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException { 170 return trustStore.getTrust(owner, fingerprint); 171 } 172 173 @Override 174 public void setTrust(BareJid owner, OpenPgpV4Fingerprint fingerprint, Trust trust) throws IOException { 175 trustStore.setTrust(owner, fingerprint, trust); 176 } 177}