mirror of
https://github.com/QuasarApp/qca.git
synced 2025-04-27 20:14:32 +00:00
no more malloc/free
svn path=/trunk/kdesupport/qca/; revision=258135
This commit is contained in:
parent
6292d9f0cb
commit
e3e16a85e5
@ -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)
|
||||
|
98
src/qca.cpp
98
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)
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user