/* ============================================================================== This file is part of the JUCE library - "Jules' Utility Class Extensions" Copyright 2004-12 by Raw Material Software Ltd. ------------------------------------------------------------------------------ JUCE can be redistributed and/or modified under the terms of the GNU General Public License (Version 2), as published by the Free Software Foundation. A copy of the license is included in the JUCE distribution, or can be found online at www.gnu.org/licenses. JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.rawmaterialsoftware.com/juce for more information. ============================================================================== */ #include "../JuceDemoHeader.h" class RSAComponent : public Component, private Button::Listener { public: RSAComponent() { addAndMakeVisible (rsaGroup); rsaGroup.setText ("RSA Encryption"); rsaGroup.setColour (GroupComponent::outlineColourId, Colours::darkgrey); rsaGroup.setColour (GroupComponent::textColourId, Colours::black); bitSizeLabel.setText ("Num Bits to Use:", dontSendNotification); bitSizeLabel.attachToComponent (&bitSize, true); addAndMakeVisible (bitSize); bitSize.setText (String (256)); addAndMakeVisible (generateRSAButton); generateRSAButton.setButtonText ("Generate RSA"); generateRSAButton.addListener (this); addAndMakeVisible (rsaResultBox); rsaResultBox.setColour (TextEditor::backgroundColourId, Colours::white.withAlpha (0.5f)); rsaResultBox.setReadOnly (true); rsaResultBox.setMultiLine (true); } void resized() override { Rectangle area (getLocalBounds()); rsaGroup.setBounds (area); area.removeFromTop (10); area.reduce (5, 5); Rectangle topArea (area.removeFromTop (34)); topArea.removeFromLeft (110); bitSize.setBounds (topArea.removeFromLeft (topArea.getWidth() / 2).reduced (5)); generateRSAButton.setBounds (topArea.reduced (5)); rsaResultBox.setBounds (area.reduced (5)); } private: void createRSAKey() { int bits = jlimit (32, 512, bitSize.getText().getIntValue()); bitSize.setText (String (bits), dontSendNotification); // Create a key-pair... RSAKey publicKey, privateKey; RSAKey::createKeyPair (publicKey, privateKey, bits); // Test the new key on a piece of data... BigInteger testValue; testValue.parseString ("1234567890abcdef", 16); BigInteger encodedValue (testValue); publicKey.applyToValue (encodedValue); BigInteger decodedValue (encodedValue); privateKey.applyToValue (decodedValue); // ..and show the results.. String message; message << "Number of bits: " << bits << newLine << "Public Key: " << publicKey.toString() << newLine << "Private Key: " << privateKey.toString() << newLine << newLine << "Test input: " << testValue.toString (16) << newLine << "Encoded: " << encodedValue.toString (16) << newLine << "Decoded: " << decodedValue.toString (16) << newLine; rsaResultBox.setText (message, false); } GroupComponent rsaGroup; TextButton generateRSAButton; Label bitSizeLabel; TextEditor bitSize, rsaResultBox; void buttonClicked (Button* buttonThatWasClicked) override { if (buttonThatWasClicked == &generateRSAButton) createRSAKey(); } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RSAComponent) }; //============================================================================== class HashesComponent : public Component, private TextEditor::Listener { public: HashesComponent() { addAndMakeVisible (hashGroup); hashGroup.setText ("Hashes"); hashGroup.setColour (GroupComponent::outlineColourId, Colours::darkgrey); hashGroup.setColour (GroupComponent::textColourId, Colours::black); addAndMakeVisible (hashEntryBox); hashEntryBox.setMultiLine (true); hashEntryBox.setColour (TextEditor::backgroundColourId, Colours::white.withAlpha (0.5f)); hashEntryBox.setReturnKeyStartsNewLine (true); hashEntryBox.setText ("Type some text in this box and the resulting MD5 and SHA hashes will update below"); hashEntryBox.addListener (this); hashLabel1.setText ("Text to Hash:", dontSendNotification); hashLabel2.setText ("MD5 Result:", dontSendNotification); hashLabel3.setText ("SHA Result:", dontSendNotification); hashLabel1.attachToComponent (&hashEntryBox, true); hashLabel2.attachToComponent (&md5Result, true); hashLabel3.attachToComponent (&shaResult, true); addAndMakeVisible (md5Result); addAndMakeVisible (shaResult); updateHashes(); } void updateHashes() { updateMD5Result(); updateSHA256Result(); } void updateMD5Result() { const MD5 md5 (hashEntryBox.getText().toUTF8()); md5Result.setText (md5.toHexString(), dontSendNotification); } void updateSHA256Result() { const SHA256 sha (hashEntryBox.getText().toUTF8()); shaResult.setText (sha.toHexString(), dontSendNotification); } void resized() override { Rectangle area (getLocalBounds()); hashGroup.setBounds (area); area.removeFromLeft (80); area.removeFromTop (10); area.reduce (5, 5); shaResult.setBounds (area.removeFromBottom (34).reduced (5)); md5Result.setBounds (area.removeFromBottom (34).reduced (5)); hashEntryBox.setBounds (area.reduced (5)); } private: GroupComponent hashGroup; TextEditor hashEntryBox; Label md5Result, shaResult; Label hashLabel1, hashLabel2, hashLabel3; void textEditorTextChanged (TextEditor& editor) override { if (&editor == &hashEntryBox) updateHashes(); } void textEditorReturnKeyPressed (TextEditor& editor) override { if (&editor == &hashEntryBox) updateHashes(); } void textEditorEscapeKeyPressed (TextEditor& editor) override { if (&editor == &hashEntryBox) updateHashes(); } void textEditorFocusLost (TextEditor& editor) override { if (&editor == &hashEntryBox) updateHashes(); } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HashesComponent) }; //============================================================================== class CryptographyDemo : public Component { public: CryptographyDemo() { addAndMakeVisible (rsaDemo); addAndMakeVisible (hashDemo); } void paint (Graphics& g) override { g.fillAll (Colour::greyLevel (0.4f)); } void resized() override { Rectangle area (getLocalBounds()); rsaDemo.setBounds (area.removeFromTop (getHeight() / 2).reduced (5)); hashDemo.setBounds (area.reduced (5)); } private: RSAComponent rsaDemo; HashesComponent hashDemo; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CryptographyDemo) }; // This static object will register this demo type in a global list of demos.. static JuceDemoType demo ("40 Cryptography");