/******************************************************************************/ /* */ /* X r d C r y p t o R S A . c c */ /* */ /* (c) 2004 by the Board of Trustees of the Leland Stanford, Jr., University */ /* Produced by Gerri Ganis for CERN */ /* */ /* This file is part of the XRootD software suite. */ /* */ /* XRootD is free software: you can redistribute it and/or modify it under */ /* the terms of the GNU Lesser General Public License as published by the */ /* Free Software Foundation, either version 3 of the License, or (at your */ /* option) any later version. */ /* */ /* XRootD 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 Lesser General Public */ /* License for more details. */ /* */ /* You should have received a copy of the GNU Lesser General Public License */ /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */ /* COPYING (GPL license). If not, see . */ /* */ /* The copyright holder's institutional names and contributor's names may not */ /* be used to endorse or promote products derived from this software without */ /* specific prior written permission of the institution or contributor. */ /******************************************************************************/ /* ************************************************************************** */ /* */ /* Abstract interface for RSA PKI functionality. */ /* Allows to plug-in modules based on different crypto implementation */ /* (OpenSSL, Botan, ...) */ /* */ /* ************************************************************************** */ #include #include "XrdCrypto/XrdCryptoRSA.hh" const char *XrdCryptoRSA::cstatus[3] = { "Invalid", "Public", "Complete" }; //_____________________________________________________________________________ void XrdCryptoRSA::Dump() { // Check key validity ABSTRACTMETHOD("XrdCryptoRSA::Dump"); } //_____________________________________________________________________________ XrdCryptoRSAdata XrdCryptoRSA::Opaque() { // Return underlying key in raw format ABSTRACTMETHOD("XrdCryptoRSA::Opaque"); return (XrdCryptoRSAdata)0; } //_____________________________________________________________________________ int XrdCryptoRSA::GetOutlen(int) { // Get length of output ABSTRACTMETHOD("XrdCryptoRSA::GetOutlen"); return 0; } //_____________________________________________________________________________ int XrdCryptoRSA::GetPublen() { // Get length of public key export form ABSTRACTMETHOD("XrdCryptoRSA::GetPublen"); return 0; } //_____________________________________________________________________________ int XrdCryptoRSA::GetPrilen() { // Get length of private key export form ABSTRACTMETHOD("XrdCryptoRSA::GetPrilen"); return 0; } //_____________________________________________________________________________ int XrdCryptoRSA::ImportPublic(const char *, int) { // Abstract method to import a public key ABSTRACTMETHOD("XrdCryptoRSA::ImportPublic"); return -1; } //_____________________________________________________________________________ int XrdCryptoRSA::ExportPublic(char *, int) { // Abstract method to export the public key ABSTRACTMETHOD("XrdCryptoRSA::ExportPublic"); return -1; } //_____________________________________________________________________________ int XrdCryptoRSA::ImportPrivate(const char *, int) { // Abstract method to import a private key ABSTRACTMETHOD("XrdCryptoRSA::ImportPrivate"); return -1; } //_____________________________________________________________________________ int XrdCryptoRSA::ExportPrivate(char *, int) { // Abstract method to export the private key ABSTRACTMETHOD("XrdCryptoRSA::ExportPrivate"); return -1; } //_____________________________________________________________________________ int XrdCryptoRSA::ExportPublic(XrdOucString &s) { // Export the public key into string s int newlen = GetPublen(); if (newlen > 0) { char *newbuf = new char[newlen+1]; if (newbuf) { memset(newbuf, 0, newlen+1); if (ExportPublic(newbuf,newlen+1) > -1) { s = (const char *)newbuf; delete[] newbuf; return 0; } delete[] newbuf; } } return -1; } //_____________________________________________________________________________ int XrdCryptoRSA::ExportPrivate(XrdOucString &s) { // Export the private key into string s int newlen = GetPrilen(); if (newlen > 0) { char *newbuf = new char[newlen+1]; if (newbuf) { memset(newbuf, 0, newlen+1); if (ExportPrivate(newbuf,newlen+1) > -1) { s = (const char *)newbuf; delete[] newbuf; return 0; } delete[] newbuf; } } return -1; } //_____________________________________________________________________________ int XrdCryptoRSA::EncryptPrivate(const char *, int, char *, int) { // Abstract method to encrypt using the private key ABSTRACTMETHOD("XrdCryptoRSA::EncryptPrivate"); return -1; } //_____________________________________________________________________________ int XrdCryptoRSA::EncryptPublic(const char *, int, char *, int) { // Abstract method to encrypt using the public key ABSTRACTMETHOD("XrdCryptoRSA::EncryptPublic"); return -1; } //_____________________________________________________________________________ int XrdCryptoRSA::DecryptPrivate(const char *, int, char *, int) { // Abstract method to decrypt using the private key ABSTRACTMETHOD("XrdCryptoRSA::DecryptPrivate"); return -1; } //_____________________________________________________________________________ int XrdCryptoRSA::DecryptPublic(const char *, int, char *, int) { // Abstract method to decrypt using the public key ABSTRACTMETHOD("XrdCryptoRSA::DecryptPublic"); return -1; } //_____________________________________________________________________________ int XrdCryptoRSA::EncryptPrivate(XrdSutBucket &bck) { // Encrypt bucket bck using the private key // Return new bucket size, or -1 in case of error int snew = -1; int sz = GetOutlen(bck.size); char *newbuf = new char[sz]; if (newbuf) { memset(newbuf, 0, sz); snew = EncryptPrivate(bck.buffer,bck.size,newbuf,sz); if (snew > -1) bck.Update(newbuf,snew); } return snew; } //_____________________________________________________________________________ int XrdCryptoRSA::EncryptPublic(XrdSutBucket &bck) { // Encrypt bucket bck using the public key // Return new bucket size, or -1 in case of error int snew = -1; int sz = GetOutlen(bck.size); char *newbuf = new char[sz]; if (newbuf) { memset(newbuf, 0, sz); snew = EncryptPublic(bck.buffer,bck.size,newbuf,sz); if (snew > -1) bck.Update(newbuf,snew); } return snew; } //_____________________________________________________________________________ int XrdCryptoRSA::DecryptPrivate(XrdSutBucket &bck) { // Decrypt bucket bck using the private key // Return new bucket size, or -1 in case of error int snew = -1; int sz = GetOutlen(bck.size); char *newbuf = new char[sz]; if (newbuf) { memset(newbuf, 0, sz); snew = DecryptPrivate(bck.buffer,bck.size,newbuf,sz); if (snew > -1) bck.Update(newbuf,snew); } return snew; } //_____________________________________________________________________________ int XrdCryptoRSA::DecryptPublic(XrdSutBucket &bck) { // Decrypt bucket bck using the public key // Return new bucket size, or -1 in case of error int snew = -1; int sz = GetOutlen(bck.size); char *newbuf = new char[sz]; if (newbuf) { memset(newbuf, 0, sz); snew = DecryptPublic(bck.buffer,bck.size,newbuf,sz); if (snew > -1) bck.Update(newbuf,snew); } return snew; }