Changeset 1323 for trunk


Ignore:
Timestamp:
04/17/19 14:23:09 (5 years ago)
Author:
bln4
Message:

Officially added code to encrypt frames with custom built labels. Minimal error checking implemented so far and logical things may not happen when unexpected data.

Location:
trunk/src/org/expeditee
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/expeditee/auth/Actions.java

    r1321 r1323  
    452452                notifiers.put(Constants.SETTINGS_AUTH, frame -> {
    453453                        AuthenticatorBrowser.CREDENTIALS_FRAME = frame.getNumber();
     454                        frame.addToData("MultiuserCredentials");
    454455                        Collection<Text> textItems = frame.getTextItems();
    455456                        for (Text t: textItems) {
  • trunk/src/org/expeditee/auth/EncryptedExpReader.java

    r1243 r1323  
    2525import org.expeditee.settings.identity.secrets.KeyList;
    2626import org.ngikm.cryptography.CryptographyConstants;
    27 
    28 import sun.reflect.generics.reflectiveObjects.NotImplementedException;
    2927
    3028public class EncryptedExpReader extends ExpReader implements CryptographyConstants {
     
    123121                                        return readLine();
    124122                                } else {
    125                                         // TODO: resolve encryption label, what does this mean?
    126123                                        personalKey = resolveLabel(label);
    127                                         return readLine();
     124                                        if (personalKey == null) {
     125                                                return null;
     126                                        } else {
     127                                                return readLine();
     128                                        }
    128129                                }
    129130                        }
     
    146147               
    147148                private SecretKeySpec resolveLabel(String label) {
    148                         throw new NotImplementedException();
     149                        byte[] keyBytes = EncryptedExpWriter.resolveKeyFromLabel(label, "");
     150                        return new SecretKeySpec(keyBytes, SymmetricAlgorithm);
    149151                }
    150152        }
    151        
    152 //      private class EncryptedProfileLineReader extends BufferedReader {
    153 //
    154 //              public EncryptedProfileLineReader(final Reader in) {
    155 //                      super(in);
    156 //              }
    157 //             
    158 //              @Override
    159 //              /**
    160 //               * Reads a line from an encrypted exp file that uses profile encryption (single key; personal key)
    161 //               * Returns that line to process, null if the currently logged in users personal key is not the appropriate one (access denied).
    162 //               */
    163 //              public String readLine() throws IOException {
    164 //                      // read encrypted line
    165 //                      final String line = super.readLine();
    166 //                     
    167 //                      if (line.isEmpty()) { return ""; }
    168 //                      if (line.startsWith(ENCRYPTED_EXP_FLAG)) {
    169 //                              // record/overwrite previous personal key then ignore this line by recursing
    170 //                              final Text text = KeyList.PersonalKey.get();
    171 //                              final byte[] keyBytes = Base64.getDecoder().decode(text.getData().get(0));
    172 //                              personalKey = new SecretKeySpec(keyBytes, SymmetricAlgorithm);
    173 //                              return readLine();
    174 //                      }
    175 //                     
    176 //                      // decrypt line and return result
    177 //                      final byte[] toDecrypt = Base64.getDecoder().decode(line);
    178 //                      final byte[] decrypted = DecryptSymmetric(toDecrypt, personalKey);
    179 //                      if (decrypted == null) {
    180 //                              accessDenied = true;
    181 //                              return null; // access denied
    182 //                      } else {
    183 //                              final String decryptedLine = new String(decrypted);
    184 //                              if (decryptedLine.startsWith("Z")) { return decryptedLine.trim(); }
    185 //                              else { return decryptedLine; }
    186 //                      }
    187 //              }       
    188 //      }
    189 //     
    190 //      private class EncryptedLineReader extends BufferedReader {
    191 //             
    192 //              public EncryptedLineReader(final Reader in) {
    193 //                      super(in);
    194 //              }
    195 //             
    196 //              @Override
    197 //              /**
    198 //               * Reads a line from an encrypted exp file that uses (potentially multiple) labeled keys
    199 //               * Returns that line to process, null if the ...
    200 //               */
    201 //              public String readLine() throws IOException {
    202 //                      // read encrypted line
    203 //                      final String line = super.readLine();
    204 //                     
    205 //                      if (line.isEmpty()) { return ""; }
    206 //                      if (line.startsWith(ENCRYPTED_EXP_FLAG)) {
    207 //                              // resolve labels to secret keys
    208 //                              final List<String> labels = Arrays.asList(line.split(" ")).stream().skip(1).collect(Collectors.toList());
    209 //                              final ThrowingFunction<String, SecretKey, Exception> worker = new ThrowingFunction<String, SecretKey, Exception>() {
    210 //                                      @Override
    211 //                                      public SecretKey applyThrows(final String label) throws Exception {
    212 //                                              return Authenticator.getInstance().getSecretKey(label, System.getProperty("password"));
    213 //                                      }
    214 //                              };
    215 //                              multiKey = labels.stream().map(l -> {
    216 //                                      try {
    217 //                                              return worker.apply(l);
    218 //                                      } catch (final Exception e) {
    219 //                                              return null;
    220 //                                      }
    221 //                              }).collect(Collectors.toList());
    222 //                             
    223 //                              // confirm you have all the keys necessary for decryption
    224 //                              if (multiKey.contains(null)) {
    225 //                                      return null;
    226 //                              }
    227 //                             
    228 //                              // move onto the next line
    229 //                              return readLine();
    230 //                      }
    231 //                     
    232 //                      // decrypt line and return result
    233 //                      final byte[] toDecrypt = Base64.getDecoder().decode(line);
    234 //                      byte[] decryptedBytes = null;
    235 //                      for (final SecretKey key: multiKey) {
    236 //                              decryptedBytes = DecryptSymmetric(toDecrypt, key);
    237 //                              if (decryptedBytes == null) { return null; }
    238 //                      }
    239 //                      final String decrypted = new String(decryptedBytes);
    240 //                      if (decrypted.startsWith("Z")) { return decrypted.trim(); }
    241 //                      else { return decrypted; }
    242 //              }
    243 //      }
    244153}
  • trunk/src/org/expeditee/auth/EncryptedExpWriter.java

    r1243 r1323  
    66import java.util.Arrays;
    77import java.util.Base64;
     8import java.util.Collection;
    89import java.util.List;
    910
     
    1516import javax.crypto.spec.SecretKeySpec;
    1617
     18import org.expeditee.gui.Frame;
     19import org.expeditee.gui.FrameIO;
     20import org.expeditee.gui.MessageBay;
    1721import org.expeditee.io.ExpWriter;
    1822import org.expeditee.items.Text;
     23import org.expeditee.settings.UserSettings;
    1924import org.expeditee.settings.identity.secrets.KeyList;
    2025import org.ngikm.cryptography.CryptographyConstants;
     
    3641                        label = "Profile";
    3742                } else {
    38                         byte[] keyBytes = resolveKeyFromLabel(encryptionLabel);
     43                        byte[] keyBytes = resolveKeyFromLabel(encryptionLabel, _framename);
    3944                        key = new SecretKeySpec(keyBytes, SymmetricAlgorithm);
    4045                        label = encryptionLabel;
     
    6772        }
    6873       
    69         private byte[] resolveKeyFromLabel(String label) {
    70                 return null;
     74        protected static byte[] resolveKeyFromLabel(String label, String framename) {
     75                String credentialsFrameName = UserSettings.ProfileName.get() + AuthenticatorBrowser.CREDENTIALS_FRAME;
     76                Frame credentialsFrame = FrameIO.LoadFrame(credentialsFrameName);
     77                Collection<Text> textItems = credentialsFrame.getTextItems();
     78                textItems.removeIf(t -> !t.getText().equals("Secrets"));
     79                textItems.removeIf(t -> !t.hasLink());
     80                if (textItems.isEmpty()) {
     81                        MessageBay.errorMessage("Unable to find label " + label + " to encrypt frame " + framename + ".");
     82                        return null;
     83                } else {
     84                        Text linkToSecretsFrame = textItems.iterator().next();
     85                        Frame secretsFrame = FrameIO.LoadFrame(linkToSecretsFrame.getParent().getFramesetName() + linkToSecretsFrame.getLink());
     86                        Collection<Text> labels = secretsFrame.getTextItems();
     87                        labels.removeIf(lbl -> lbl.getText().equals(label));
     88                        labels.removeIf(lbl -> lbl.getData() == null || lbl.getData().size() == 0);
     89                        if (labels.isEmpty()) {
     90                                MessageBay.errorMessage("Unable to find label " + label + " to encrypt frame " + framename + ".");
     91                                return null;
     92                        }
     93                       
     94                        Text labelItem = labels.iterator().next();
     95                        String data = labelItem.getData().get(0);
     96                        if (data.contains("{")) {
     97                                MessageBay.errorMessage("You only have a fraction of the required key to access " + framename + ".");
     98                                return null;
     99                        } else {
     100                                try {
     101                                        return Base64.getDecoder().decode(data);
     102                                } catch (IllegalArgumentException e) {
     103                                        MessageBay.errorMessage("Unable to create key out of data stored in label " + label + ".");
     104                                        return null;
     105                                }
     106                        }
     107                }
    71108        }
    72109       
  • trunk/src/org/expeditee/io/ExpWriter.java

    r1321 r1323  
    5151        protected StringBuilder _stringWriter = null;
    5252
     53        protected String _framename;
     54
    5355        private static final char TERMINATOR = 'Z';
    5456
     
    5961        @Override
    6062        public void initialise(Frame start, Writer writer) throws IOException {
     63                _framename = start.getName();
    6164                String name = start.getFramesetName().toLowerCase();
    6265
Note: See TracChangeset for help on using the changeset viewer.