/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2017 - ROLI Ltd. JUCE is an open source library subject to commercial or open-source licensing. By using JUCE, you agree to the terms of both the JUCE 5 End-User License Agreement and JUCE 5 Privacy Policy (both updated and effective as of the 27th April 2017). End User License Agreement: www.juce.com/juce-5-licence Privacy Policy: www.juce.com/juce-5-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see www.gnu.org/licenses). JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ #include "../JuceDemoHeader.h" class RSAComponent : public Component, private Button::Listener { public: RSAComponent() { addAndMakeVisible (rsaGroup); rsaGroup.setText ("RSA Encryption"); rsaGroup.setColour (GroupComponent::outlineColourId, getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::outline, Colours::grey)); rsaGroup.setColour (GroupComponent::textColourId, getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::defaultText, Colours::white)); rsaResultBox.setColour (TextEditor::backgroundColourId, getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::widgetBackground, Colours::white.withAlpha (0.5f))); 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.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, 1024, 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, getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::outline, Colours::grey)); hashGroup.setColour (GroupComponent::textColourId, getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::defaultText, Colours::white)); hashEntryBox.setColour (TextEditor::backgroundColourId, getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::widgetBackground, Colours::white.withAlpha (0.5f))); addAndMakeVisible (hashEntryBox); hashEntryBox.setMultiLine (true); hashEntryBox.setReturnKeyStartsNewLine (true); hashEntryBox.setText ("Type some text in this box and the resulting MD5, SHA and Whirlpool hashes will update below"); hashEntryBox.addListener (this); hashLabel1.setText ("Text to Hash:", dontSendNotification); hashLabel2.setText ("MD5 Result:", dontSendNotification); hashLabel3.setText ("SHA Result:", dontSendNotification); hashLabel4.setText ("Whirlpool Result:", dontSendNotification); hashLabel1.attachToComponent (&hashEntryBox, true); hashLabel2.attachToComponent (&md5Result, true); hashLabel3.attachToComponent (&shaResult, true); hashLabel4.attachToComponent (&whirlpoolResult, true); addAndMakeVisible (md5Result); addAndMakeVisible (shaResult); addAndMakeVisible (whirlpoolResult); updateHashes(); } void updateHashes() { String text = hashEntryBox.getText(); updateMD5Result (text.toUTF8()); updateSHA256Result (text.toUTF8()); updateWhirlpoolResult (text.toUTF8()); } void updateMD5Result (CharPointer_UTF8 text) { md5Result.setText (MD5 (text).toHexString(), dontSendNotification); } void updateSHA256Result (CharPointer_UTF8 text) { shaResult.setText (SHA256 (text).toHexString(), dontSendNotification); } void updateWhirlpoolResult (CharPointer_UTF8 text) { whirlpoolResult.setText (Whirlpool (text).toHexString(), dontSendNotification); } void resized() override { Rectangle area (getLocalBounds()); hashGroup.setBounds (area); area.removeFromLeft (120); area.removeFromTop (10); area.reduce (5, 5); whirlpoolResult.setBounds (area.removeFromBottom (34)); shaResult.setBounds (area.removeFromBottom (34)); md5Result.setBounds (area.removeFromBottom (34)); hashEntryBox.setBounds (area.reduced (5)); } private: GroupComponent hashGroup; TextEditor hashEntryBox; Label md5Result, shaResult, whirlpoolResult; Label hashLabel1, hashLabel2, hashLabel3, hashLabel4; void textEditorTextChanged (TextEditor&) override { updateHashes(); } void textEditorReturnKeyPressed (TextEditor&) override { updateHashes(); } void textEditorEscapeKeyPressed (TextEditor&) override { updateHashes(); } void textEditorFocusLost (TextEditor&) override { 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 (getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::windowBackground, 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");