summaryrefslogtreecommitdiff
path: root/cpp/src/IceSSL/RSAPrivateKey.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/IceSSL/RSAPrivateKey.cpp')
-rw-r--r--cpp/src/IceSSL/RSAPrivateKey.cpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/cpp/src/IceSSL/RSAPrivateKey.cpp b/cpp/src/IceSSL/RSAPrivateKey.cpp
new file mode 100644
index 00000000000..9c6bdf4e29c
--- /dev/null
+++ b/cpp/src/IceSSL/RSAPrivateKey.cpp
@@ -0,0 +1,121 @@
+// **********************************************************************
+//
+// Copyright (c) 2001
+// MutableRealms, Inc.
+// Huntsville, AL, USA
+//
+// All Rights Reserved
+//
+// **********************************************************************
+
+#include <IceUtil/Config.h>
+#include <IceUtil/Base64.h>
+#include <IceSSL/RSAPrivateKey.h>
+#include <IceSSL/Convert.h>
+#include <IceSSL/OpenSSLUtils.h>
+#include <IceSSL/Exception.h>
+#include <assert.h>
+
+void ::IceInternal::incRef(::IceSSL::OpenSSL::RSAPrivateKey* p) { p->__incRef(); }
+void ::IceInternal::decRef(::IceSSL::OpenSSL::RSAPrivateKey* p) { p->__decRef(); }
+
+using std::back_inserter;
+using std::string;
+using Ice::ByteSeq;
+using IceUtil::Base64;
+
+IceSSL::OpenSSL::RSAPrivateKey::RSAPrivateKey(const string& key)
+{
+ assert(!key.empty());
+
+ _privateKey = 0;
+
+ ByteSeq keySeq = Base64::decode(key);
+
+ byteSeqToKey(keySeq);
+}
+
+IceSSL::OpenSSL::RSAPrivateKey::RSAPrivateKey(const ByteSeq& keySeq)
+{
+ assert(!keySeq.empty());
+
+ _privateKey = 0;
+
+ byteSeqToKey(keySeq);
+}
+
+IceSSL::OpenSSL::RSAPrivateKey::RSAPrivateKey(RSA* rsa) :
+ _privateKey(rsa)
+{
+ assert(_privateKey != 0);
+}
+
+IceSSL::OpenSSL::RSAPrivateKey::~RSAPrivateKey()
+{
+ if (_privateKey != 0)
+ {
+ RSA_free(_privateKey);
+ }
+}
+
+void
+IceSSL::OpenSSL::RSAPrivateKey::keyToBase64(string& b64Key)
+{
+ ByteSeq keySeq;
+ keyToByteSeq(keySeq);
+ b64Key = Base64::encode(keySeq);
+}
+
+void
+IceSSL::OpenSSL::RSAPrivateKey::keyToByteSeq(ByteSeq& keySeq)
+{
+ assert(_privateKey);
+
+ // Output the Private Key to a char buffer
+ unsigned int privKeySize = i2d_RSAPrivateKey(_privateKey, 0);
+
+ assert(privKeySize > 0);
+
+ unsigned char* privateKeyBuffer = new unsigned char[privKeySize];
+ assert(privateKeyBuffer != 0);
+
+ // We have to do this because i2d_RSAPrivateKey changes the pointer.
+ unsigned char* privKeyBuff = privateKeyBuffer;
+ i2d_RSAPrivateKey(_privateKey, &privKeyBuff);
+
+ IceSSL::ucharToByteSeq(privateKeyBuffer, privKeySize, keySeq);
+
+ delete [] privateKeyBuffer;
+}
+
+RSA*
+IceSSL::OpenSSL::RSAPrivateKey::get() const
+{
+ return _privateKey;
+}
+
+void
+IceSSL::OpenSSL::RSAPrivateKey::byteSeqToKey(const ByteSeq& keySeq)
+{
+ unsigned char* privateKeyBuffer = byteSeqToUChar(keySeq);
+ assert(privateKeyBuffer != 0);
+
+ unsigned char* privKeyBuff = privateKeyBuffer;
+ unsigned char** privKeyBuffpp = &privKeyBuff;
+ RSA** rsapp = &_privateKey;
+
+ _privateKey = d2i_RSAPrivateKey(rsapp, privKeyBuffpp, (long)keySeq.size());
+
+ if (_privateKey == 0)
+ {
+ IceSSL::PrivateKeyParseException pkParseException(__FILE__, __LINE__);
+
+ pkParseException._message = "unable to parse provided private key\n" + sslGetErrors();
+
+ throw pkParseException;
+ }
+
+ // ML: Not deleted if an exception is raised!
+ delete [] privateKeyBuffer;
+}
+