/******************************************************************************/
/* */
/* X r d C r y p t o C i p h e r . 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. */
/******************************************************************************/
/* ************************************************************************** */
/* */
/* Generic interface to a cipher class */
/* Allows to plug-in modules based on different crypto implementation */
/* (OpenSSL, Botan, ...) */
/* */
/* ************************************************************************** */
#include
#include "XrdCrypto/XrdCryptoAux.hh"
#include "XrdCrypto/XrdCryptoCipher.hh"
//_____________________________________________________________________________
bool XrdCryptoCipher::Finalize(bool, char *, int, const char *)
{
// Finalize key computation (key agreement)
ABSTRACTMETHOD("XrdCryptoCipher::Finalize");
return 0;
}
//_____________________________________________________________________________
bool XrdCryptoCipher::IsValid()
{
// Check key validity
ABSTRACTMETHOD("XrdCryptoCipher::IsValid");
return 0;
}
//____________________________________________________________________________
void XrdCryptoCipher::SetIV(int l, const char *iv)
{
// Set IV from l bytes at iv. If !iv, sets the IV length.
ABSTRACTMETHOD("XrdCryptoCipher::SetIV");
}
//____________________________________________________________________________
char *XrdCryptoCipher::RefreshIV(int &l)
{
// Regenerate IV and return it
ABSTRACTMETHOD("XrdCryptoCipher::RefreshIV");
return 0;
}
//____________________________________________________________________________
char *XrdCryptoCipher::IV(int &l) const
{
// Get IV
ABSTRACTMETHOD("XrdCryptoCipher::IV");
return 0;
}
//____________________________________________________________________________
char *XrdCryptoCipher::Public(int &lpub)
{
// Getter for public part during key agreement
ABSTRACTMETHOD("XrdCryptoCipher::Public");
return 0;
}
//_____________________________________________________________________________
XrdSutBucket *XrdCryptoCipher::AsBucket()
{
// Return pointer to a bucket created using the internal information
// serialized
ABSTRACTMETHOD("XrdCryptoCipher::AsBucket");
return 0;
}
//____________________________________________________________________________
int XrdCryptoCipher::Encrypt(const char *, int, char *)
{
// Encrypt lin bytes at in with local cipher.
ABSTRACTMETHOD("XrdCryptoCipher::Encrypt");
return 0;
}
//____________________________________________________________________________
int XrdCryptoCipher::Decrypt(const char *, int, char *)
{
// Decrypt lin bytes at in with local cipher.
ABSTRACTMETHOD("XrdCryptoCipher::Decrypt");
return 0;
}
//____________________________________________________________________________
int XrdCryptoCipher::EncOutLength(int)
{
// Required buffer size for encrypting l bytes
ABSTRACTMETHOD("XrdCryptoCipher::EncOutLength");
return 0;
}
//____________________________________________________________________________
int XrdCryptoCipher::DecOutLength(int)
{
// Required buffer size for decrypting l bytes
ABSTRACTMETHOD("XrdCryptoCipher::DecOutLength");
return 0;
}
//____________________________________________________________________________
bool XrdCryptoCipher::IsDefaultLength() const
{
// Test if cipher length is the default one
ABSTRACTMETHOD("XrdCryptoCipher::IsDefaultLength");
return 0;
}
//____________________________________________________________________________
int XrdCryptoCipher::MaxIVLength() const
{
// Return the max cipher IV length
ABSTRACTMETHOD("XrdCryptoCipher::MaxIVLength");
return 0;
}
//____________________________________________________________________________
int XrdCryptoCipher::Encrypt(XrdSutBucket &bck, bool useiv)
{
// Encrypt bucket bck with local cipher
// Return size of encoded bucket or -1 in case of error
int snew = -1;
int liv = 0;
char *iv = 0;
if (useiv) {
iv = RefreshIV(liv);
if (!iv) return snew;
}
int sz = EncOutLength(bck.size) + liv;
char *newbck = new char[sz];
if (newbck) {
memset(newbck, 0, sz);
if (liv > 0) memcpy(newbck, iv, liv);
snew = Encrypt(bck.buffer,bck.size,newbck+liv);
if (snew > -1)
bck.Update(newbck,snew + liv);
}
return snew;
}
//____________________________________________________________________________
int XrdCryptoCipher::Decrypt(XrdSutBucket &bck, bool useiv)
{
// Decrypt bucket bck with local cipher
// Return size of encoded bucket or -1 in case of error
int snew = -1;
int liv = (useiv) ? MaxIVLength() : 0;
int sz = DecOutLength(bck.size - liv);
char *newbck = new char[sz];
if (newbck) {
if (useiv) {
char *iv = new char[liv];
if (iv) {
memcpy(iv,bck.buffer,liv);
SetIV(liv, iv);
delete[] iv;
} else {
return snew;
}
}
memset(newbck, 0, sz);
snew = Decrypt(bck.buffer + liv, bck.size - liv, newbck);
if (snew > -1)
bck.Update(newbck,snew);
}
return snew;
}