no more malloc/free

svn path=/trunk/kdesupport/qca/; revision=258135
This commit is contained in:
Justin Karneges 2003-10-12 03:57:11 +00:00
parent 6292d9f0cb
commit e3e16a85e5
3 changed files with 92 additions and 144 deletions

View File

@ -84,22 +84,19 @@ static void appendArray(QByteArray *a, const QByteArray &b)
memcpy(a->data() + oldsize, b.data(), b.size());
}
static char *bio2buf(BIO *b, unsigned int *len)
static QByteArray bio2buf(BIO *b)
{
char *buf = (char *)malloc(1);
int size = 0;
QByteArray buf;
while(1) {
char block[1024];
int ret = BIO_read(b, block, 1024);
buf = (char *)realloc(buf, size + ret);
memcpy(buf + size, block, ret);
size += ret;
int oldsize = buf.size();
buf.resize(oldsize + ret);
memcpy(buf.data() + oldsize, block, ret);
if(ret != 1024)
break;
}
BIO_free(b);
*len = size;
return buf;
}
@ -126,12 +123,11 @@ public:
SHA1_Update(&c, in, len);
}
void final(char **out, unsigned int *outlen)
void final(QByteArray *out)
{
*outlen = 20;
unsigned char *outbuf = (unsigned char *)malloc(*outlen);
SHA1_Final(outbuf, &c);
*out = (char *)outbuf;
QByteArray buf(20);
SHA1_Final((unsigned char *)buf.data(), &c);
*out = buf;
}
SHA_CTX c;
@ -160,12 +156,11 @@ public:
MD5_Update(&c, in, len);
}
void final(char **out, unsigned int *outlen)
void final(QByteArray *out)
{
*outlen = 16;
unsigned char *outbuf = (unsigned char *)malloc(*outlen);
MD5_Final(outbuf, &c);
*out = (char *)outbuf;
QByteArray buf(16);
MD5_Final((unsigned char *)buf.data(), &c);
*out = buf;
}
MD5_CTX c;
@ -262,7 +257,7 @@ public:
return true;
}
bool final(char **out, unsigned int *outlen)
bool final(QByteArray *out)
{
if(pad) {
QByteArray result(type->block_size);
@ -279,11 +274,7 @@ public:
appendArray(&r, result);
}
*outlen = r.size();
unsigned char *outbuf = (unsigned char *)malloc(*outlen);
*out = (char *)outbuf;
memcpy(outbuf, r.data(), r.size());
*out = r.copy();
r.resize(0);
return true;
}
@ -541,59 +532,56 @@ public:
return c;
}
void toDER(char **out, unsigned int *outlen, bool publicOnly)
bool toDER(QByteArray *out, bool publicOnly)
{
if(sec && !publicOnly) {
int len = i2d_RSAPrivateKey(sec, NULL);
unsigned char *buf, *p;
buf = (unsigned char *)malloc(len);
p = buf;
QByteArray buf(len);
unsigned char *p;
p = (unsigned char *)buf.data();
i2d_RSAPrivateKey(sec, &p);
*out = (char *)buf;
*outlen = len;
*out = buf;
return true;
}
else if(pub) {
int len = i2d_RSAPublicKey(pub, NULL);
unsigned char *buf, *p;
buf = (unsigned char *)malloc(len);
p = buf;
QByteArray buf(len);
unsigned char *p;
p = (unsigned char *)buf.data();
i2d_RSAPublicKey(pub, &p);
*out = (char *)buf;
*outlen = len;
}
else {
*out = 0;
*outlen = 0;
*out = buf;
return true;
}
else
return false;
}
void toPEM(char **out, unsigned int *outlen, bool publicOnly)
bool toPEM(QByteArray *out, bool publicOnly)
{
BIO *bo;
if(sec && !publicOnly) {
bo = BIO_new(BIO_s_mem());
BIO *bo = BIO_new(BIO_s_mem());
PEM_write_bio_RSAPrivateKey(bo, sec, NULL, NULL, 0, NULL, NULL);
*out = bio2buf(bo);
return true;
}
else if(pub) {
bo = BIO_new(BIO_s_mem());
BIO *bo = BIO_new(BIO_s_mem());
PEM_write_bio_RSAPublicKey(bo, pub);
*out = bio2buf(bo);
return true;
}
else {
*out = 0;
*outlen = 0;
return;
}
else
return false;
*out = bio2buf(bo, outlen);
}
bool encrypt(const char *in, unsigned int len, char **out, unsigned int *outlen, bool oaep)
bool encrypt(const QByteArray &in, QByteArray *out, bool oaep)
{
if(!pub)
return false;
int size = RSA_size(pub);
int flen = len;
int flen = in.size();
if(oaep) {
if(flen >= size - 41)
flen = size - 41;
@ -603,37 +591,33 @@ public:
flen = size - 11;
}
QByteArray result(size);
unsigned char *from = (unsigned char *)in;
unsigned char *from = (unsigned char *)in.data();
unsigned char *to = (unsigned char *)result.data();
int ret = RSA_public_encrypt(flen, from, to, pub, oaep ? RSA_PKCS1_OAEP_PADDING : RSA_PKCS1_PADDING);
if(ret == -1)
return false;
result.resize(ret);
*out = (char *)malloc(result.size());
memcpy((*out), result.data(), result.size());
*outlen = result.size();
*out = result;
return true;
}
bool decrypt(const char *in, unsigned int len, char **out, unsigned int *outlen, bool oaep)
bool decrypt(const QByteArray &in, QByteArray *out, bool oaep)
{
if(!sec)
return false;
int size = RSA_size(sec);
int flen = len;
int flen = in.size();
QByteArray result(size);
unsigned char *from = (unsigned char *)in;
unsigned char *from = (unsigned char *)in.data();
unsigned char *to = (unsigned char *)result.data();
int ret = RSA_private_decrypt(flen, from, to, sec, oaep ? RSA_PKCS1_OAEP_PADDING : RSA_PKCS1_PADDING);
if(ret == -1)
return false;
result.resize(ret);
*out = (char *)malloc(result.size());
memcpy((*out), result.data(), result.size());
*outlen = result.size();
*out = result;
return true;
}
@ -834,22 +818,22 @@ public:
return true;
}
void toDER(char **out, unsigned int *outlen)
bool toDER(QByteArray *out)
{
int len = i2d_X509(x, NULL);
unsigned char *buf, *p;
buf = (unsigned char *)malloc(len);
p = buf;
QByteArray buf(len);
unsigned char *p = (unsigned char *)buf.data();
i2d_X509(x, &p);
*out = (char *)buf;
*outlen = len;
*out = buf;
return true;
}
void toPEM(char **out, unsigned int *outlen)
bool toPEM(QByteArray *out)
{
BIO *bo = BIO_new(BIO_s_mem());
PEM_write_bio_X509(bo, x);
*out = bio2buf(bo, outlen);
*out = bio2buf(bo);
return true;
}
void fromX509(X509 *t)

View File

@ -309,12 +309,8 @@ void Hash::update(const QByteArray &a)
QByteArray Hash::final()
{
char *out;
unsigned int len;
d->c->final(&out, &len);
QByteArray buf(len);
memcpy(buf.data(), out, len);
free(out);
QByteArray buf;
d->c->final(&buf);
return buf;
}
@ -435,18 +431,14 @@ QByteArray Cipher::final(bool *ok)
if(d->err)
return QByteArray();
char *out;
unsigned int len;
if(!d->c->final(&out, &len)) {
QByteArray out;
if(!d->c->final(&out)) {
d->err = true;
return QByteArray();
}
QByteArray buf(len);
memcpy(buf.data(), out, len);
free(out);
if(ok)
*ok = true;
return buf;
return out;
}
@ -573,17 +565,10 @@ bool RSAKey::havePrivate() const
QByteArray RSAKey::toDER(bool publicOnly) const
{
char *out;
unsigned int len;
d->c->toDER(&out, &len, publicOnly);
if(!out)
QByteArray out;
if(!d->c->toDER(&out, publicOnly))
return QByteArray();
else {
QByteArray buf(len);
memcpy(buf.data(), out, len);
free(out);
return buf;
}
return out;
}
bool RSAKey::fromDER(const QByteArray &a)
@ -593,18 +578,14 @@ bool RSAKey::fromDER(const QByteArray &a)
QString RSAKey::toPEM(bool publicOnly) const
{
char *out;
unsigned int len;
d->c->toPEM(&out, &len, publicOnly);
if(!out)
QByteArray out;
if(!d->c->toPEM(&out, publicOnly))
return QByteArray();
else {
QCString cs;
cs.resize(len+1);
memcpy(cs.data(), out, len);
free(out);
return QString::fromLatin1(cs);
}
QCString cs;
cs.resize(out.size()+1);
memcpy(cs.data(), out.data(), out.size());
return QString::fromLatin1(cs);
}
bool RSAKey::fromPEM(const QString &str)
@ -622,25 +603,19 @@ bool RSAKey::fromNative(void *p)
bool RSAKey::encrypt(const QByteArray &a, QByteArray *b, bool oaep) const
{
char *out;
unsigned int len;
if(!d->c->encrypt(a.data(), a.size(), &out, &len, oaep))
QByteArray out;
if(!d->c->encrypt(a, &out, oaep))
return false;
b->resize(len);
memcpy(b->data(), out, len);
free(out);
*b = out;
return true;
}
bool RSAKey::decrypt(const QByteArray &a, QByteArray *b, bool oaep) const
{
char *out;
unsigned int len;
if(!d->c->decrypt(a.data(), a.size(), &out, &len, oaep))
QByteArray out;
if(!d->c->decrypt(a, &out, oaep))
return false;
b->resize(len);
memcpy(b->data(), out, len);
free(out);
*b = out;
return true;
}
@ -798,17 +773,10 @@ QDateTime Cert::notAfter() const
QByteArray Cert::toDER() const
{
char *out;
unsigned int len;
d->c->toDER(&out, &len);
if(!out)
QByteArray out;
if(!d->c->toDER(&out))
return QByteArray();
else {
QByteArray buf(len);
memcpy(buf.data(), out, len);
free(out);
return buf;
}
return out;
}
bool Cert::fromDER(const QByteArray &a)
@ -818,18 +786,14 @@ bool Cert::fromDER(const QByteArray &a)
QString Cert::toPEM() const
{
char *out;
unsigned int len;
d->c->toPEM(&out, &len);
if(!out)
QByteArray out;
if(!d->c->toPEM(&out))
return QByteArray();
else {
QCString cs;
cs.resize(len+1);
memcpy(cs.data(), out, len);
free(out);
return QString::fromLatin1(cs);
}
QCString cs;
cs.resize(out.size()+1);
memcpy(cs.data(), out.data(), out.size());
return QString::fromLatin1(cs);
}
bool Cert::fromPEM(const QString &str)

View File

@ -50,7 +50,7 @@ public:
virtual QCA_HashContext *clone()=0;
virtual void reset()=0;
virtual void update(const char *in, unsigned int len)=0;
virtual void final(char **out, unsigned int *outlen)=0;
virtual void final(QByteArray *out)=0;
};
class QCA_CipherContext
@ -66,7 +66,7 @@ public:
virtual bool setup(int dir, int mode, const char *key, int keysize, const char *iv, bool pad)=0;
virtual bool update(const char *in, unsigned int len)=0;
virtual bool final(char **out, unsigned int *outlen)=0;
virtual bool final(QByteArray *out)=0;
};
class QCA_RSAKeyContext
@ -82,11 +82,11 @@ public:
virtual bool createFromPEM(const char *in, unsigned int len)=0;
virtual bool createFromNative(void *in)=0;
virtual bool generate(unsigned int bits)=0;
virtual void toDER(char **out, unsigned int *len, bool publicOnly)=0;
virtual void toPEM(char **out, unsigned int *len, bool publicOnly)=0;
virtual bool toDER(QByteArray *out, bool publicOnly)=0;
virtual bool toPEM(QByteArray *out, bool publicOnly)=0;
virtual bool encrypt(const char *in, unsigned int len, char **out, unsigned int *outlen, bool oaep)=0;
virtual bool decrypt(const char *in, unsigned int len, char **out, unsigned int *outlen, bool oaep)=0;
virtual bool encrypt(const QByteArray &in, QByteArray *out, bool oaep)=0;
virtual bool decrypt(const QByteArray &in, QByteArray *out, bool oaep)=0;
};
struct QCA_CertProperty
@ -104,8 +104,8 @@ public:
virtual bool isNull() const=0;
virtual bool createFromDER(const char *in, unsigned int len)=0;
virtual bool createFromPEM(const char *in, unsigned int len)=0;
virtual void toDER(char **out, unsigned int *len)=0;
virtual void toPEM(char **out, unsigned int *len)=0;
virtual bool toDER(QByteArray *out)=0;
virtual bool toPEM(QByteArray *out)=0;
virtual QString serialNumber() const=0;
virtual QString subjectString() const=0;