/******************************************************************************/
/* */
/* X r d C r y p t o B a s i c. h h */
/* */
/* (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 buffer for crypto functions needed in XrdCrypto */
/* Different crypto implementation (OpenSSL, Botan, ...) available as plug-in */
/* */
/* ************************************************************************** */
#include
#include
#include "XrdSut/XrdSutAux.hh"
#include "XrdCrypto/XrdCryptoAux.hh"
#include "XrdCrypto/XrdCryptoBasic.hh"
// ---------------------------------------------------------------------------//
//
// Basic crypto buffer implementation
//
// ---------------------------------------------------------------------------//
//_____________________________________________________________________________
XrdCryptoBasic::XrdCryptoBasic(const char *t, int l, const char *b)
{
// Basic constructor.
// This class has responsibility over both its buffers.
type = 0;
membuf = 0;
lenbuf = 0;
//
// Fill in the type, if any
if (t) {
int tl = strlen(t);
if (tl) {
type = new char[tl+1];
if (type) {
memcpy(type,t,tl);
type[tl] = 0;
}
}
}
//
// Fill the buffer and length
if (l > 0) {
membuf = new char[l];
if (membuf) {
lenbuf = l;
if (b)
memcpy(membuf,b,l);
else
memset(membuf,0,l);
}
}
}
//_____________________________________________________________________________
XrdSutBucket *XrdCryptoBasic::AsBucket()
{
// Return pointer to a bucket created using the internal buffer
// Type is not copied.
// The bucket is responsible for the allocated memory
XrdSutBucket *buck = (XrdSutBucket *)0;
if (Length()) {
char *nbuf = new char[Length()];
if (nbuf) {
memcpy(nbuf,Buffer(),Length());
buck = new XrdSutBucket(nbuf,Length());
}
}
return buck;
}
//_____________________________________________________________________________
char *XrdCryptoBasic::AsHexString()
{
// Return the internal buffer as a hexadecimal string
static char out[XrdSutMAXBUF];
int lmax = XrdSutMAXBUF / 2 - 1 ;
int lconv = (Length() > lmax) ? lmax : Length();
if (!XrdSutToHex(Buffer(),lconv,&out[0]))
return &out[0];
return 0;
}
//_____________________________________________________________________________
int XrdCryptoBasic::FromHex(const char *hex)
{
// Set a binary buffer from a null-terminated hexadecimal string
// Returns 0 in case of success, -1 otherwise.
if (!hex)
return -1;
// Determine length
int lhex = strlen(hex);
int lout = lhex / 2;
if (lout * 2 < lhex) lout++;
// Allocate buffer
char *bout = new char[lout];
if (bout) {
if (XrdSutFromHex(hex, bout, lout) != 0) {
delete[] bout;
return -1;
}
UseBuffer(lout,bout);
return 0;
}
// Failure
return -1;
}
//_____________________________________________________________________________
int XrdCryptoBasic::SetLength(int l)
{
// Truncate or enlarge the data buffer length to l; new bytes are filled
// with 0 in case of enlargement
// Returns 0 in case of success, -1 in case of error (in buffer allocation).
if (l > 0) {
//
// Create new buffer
char *newbuf = new char[l];
if (newbuf) {
//
// Save existing info
memcpy(newbuf,membuf,l);
//
// Reset additional bytes, if any
if (l > lenbuf)
memset(newbuf+lenbuf,0,(l-lenbuf));
//
// Release old buffer
delete[] membuf;
//
// Set the new length and buffer
lenbuf = l;
membuf = newbuf;
} else
return -1;
} else {
//
// Release existing buffer, if any
if (membuf)
delete[] membuf;
lenbuf = 0;
membuf = 0;
}
return 0;
}
//_____________________________________________________________________________
int XrdCryptoBasic::SetBuffer(int l, const char *b)
{
// Substitute buffer with the l bytes at b.
// Returns 0 in case of success, -1 in case of error (in buffer allocation).
if (l > 0) {
//
// Allocate new buffer
char *tmpbuf = new char[l];
if (tmpbuf) {
if (b)
memcpy(tmpbuf,b,l);
else
memset(tmpbuf,0,l);
if (membuf)
delete[] membuf;
lenbuf = l;
membuf = tmpbuf;
} else
return -1;
} else {
//
// Release existing buffer, if any
if (membuf)
delete[] membuf;
lenbuf = 0;
membuf = 0;
}
return 0;
}
//_____________________________________________________________________________
int XrdCryptoBasic::SetType(const char *t)
{
// Substitute type with the string at t.
// Returns 0 in case of success, -1 in case of error (in buffer allocation).
if (t) {
//
// Allocate new buffer
int tl = strlen(t);
char *tmpbuf = new char[tl+1];
if (tmpbuf) {
strcpy(tmpbuf,t);
delete[] type;
type = tmpbuf;
} else
return -1;
} else {
//
// Release existing buffer, if any
if (type)
delete[] type;
type = 0;
}
return 0;
}