From e3e16a85e5ce375f10bc1fd00a39ec9c45c58b41 Mon Sep 17 00:00:00 2001 From: Justin Karneges Date: Sun, 12 Oct 2003 03:57:11 +0000 Subject: [PATCH] no more malloc/free svn path=/trunk/kdesupport/qca/; revision=258135 --- plugins/qca-tls/qca-tls.cpp | 122 ++++++++++++++++-------------------- src/qca.cpp | 98 +++++++++-------------------- src/qcaprovider.h | 16 ++--- 3 files changed, 92 insertions(+), 144 deletions(-) diff --git a/plugins/qca-tls/qca-tls.cpp b/plugins/qca-tls/qca-tls.cpp index 775b98f8..233f0c33 100644 --- a/plugins/qca-tls/qca-tls.cpp +++ b/plugins/qca-tls/qca-tls.cpp @@ -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) diff --git a/src/qca.cpp b/src/qca.cpp index 16989915..4cdc9414 100644 --- a/src/qca.cpp +++ b/src/qca.cpp @@ -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) diff --git a/src/qcaprovider.h b/src/qcaprovider.h index 8481b94e..16352295 100644 --- a/src/qcaprovider.h +++ b/src/qcaprovider.h @@ -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;