X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fgcrypt%2Frsagen.c;h=030f2bcb1111ba04636994a39e9a478ae4d328e5;hb=f6e87ab476a0faf8b124ecaaa27f967d825e6457;hp=9c553b8f206593e6a05ad85d2f90b162cf0b4201;hpb=07a560eab66b575f382428a956550817697e25e2;p=tinc diff --git a/src/gcrypt/rsagen.c b/src/gcrypt/rsagen.c index 9c553b8f..030f2bcb 100644 --- a/src/gcrypt/rsagen.c +++ b/src/gcrypt/rsagen.c @@ -1,6 +1,6 @@ /* rsagen.c -- RSA key generation and export - Copyright (C) 2008 Guus Sliepen + Copyright (C) 2008-2012 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -12,11 +12,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - $Id$ + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "system.h" @@ -46,14 +44,16 @@ static bool pem_encode(FILE *fp, const char *header, uint8_t *buf, size_t size) word = buf[i] << 16 | buf[i + 1] << 8 | buf[i + 2]; } else { word = buf[i] << 16; - if(i == size - 2) + + if(i == size - 2) { word |= buf[i + 1] << 8; + } } line[j++] = b64e[(word >> 18) ]; line[j++] = b64e[(word >> 12) & 0x3f]; line[j++] = b64e[(word >> 6) & 0x3f]; - line[j++] = b64e[(word ) & 0x3f]; + line[j++] = b64e[(word) & 0x3f]; if(j >= 64) { line[j++] = '\n'; @@ -64,8 +64,10 @@ static bool pem_encode(FILE *fp, const char *header, uint8_t *buf, size_t size) } if(size % 3 > 0) { - if(size % 3 > 1) + if(size % 3 > 1) { line[j++] = '='; + } + line[j++] = '='; } @@ -84,19 +86,24 @@ static bool pem_encode(FILE *fp, const char *header, uint8_t *buf, size_t size) // BER encoding functions static bool ber_write_id(uint8_t **p, size_t *buflen, int id) { - if(*buflen <= 0) + if(*buflen <= 0) { return false; + } if(id >= 0x1f) { while(id) { - if(*buflen <= 0) + if(*buflen <= 0) { return false; + } (*buflen)--; **p = id & 0x7f; id >>= 7; - if(id) + + if(id) { **p |= 0x80; + } + (*p)++; } } else { @@ -109,14 +116,18 @@ static bool ber_write_id(uint8_t **p, size_t *buflen, int id) { static bool ber_write_len(uint8_t **p, size_t *buflen, size_t len) { do { - if(*buflen <= 0) + if(*buflen <= 0) { return false; + } (*buflen)--; **p = len & 0x7f; len >>= 7; - if(len) + + if(len) { **p |= 0x80; + } + (*p)++; } while(len); @@ -124,8 +135,9 @@ static bool ber_write_len(uint8_t **p, size_t *buflen, size_t len) { } static bool ber_write_sequence(uint8_t **p, size_t *buflen, uint8_t *seqbuf, size_t seqlen) { - if(!ber_write_id(p, buflen, 0x10) || !ber_write_len(p, buflen, seqlen) || *buflen < seqlen) + if(!ber_write_id(p, buflen, 0x10) || !ber_write_len(p, buflen, seqlen) || *buflen < seqlen) { return false; + } memcpy(*p, seqbuf, seqlen); *p += seqlen; @@ -136,15 +148,18 @@ static bool ber_write_sequence(uint8_t **p, size_t *buflen, uint8_t *seqbuf, siz static bool ber_write_mpi(uint8_t **p, size_t *buflen, gcry_mpi_t mpi) { uint8_t tmpbuf[1024]; - size_t tmplen = sizeof tmpbuf; + size_t tmplen = sizeof(tmpbuf); gcry_error_t err; err = gcry_mpi_aprint(GCRYMPI_FMT_USG, &tmpbuf, &tmplen, mpi); - if(err) + + if(err) { return false; + } - if(!ber_write_id(p, buflen, 0x02) || !ber_write_len(p, buflen, tmplen) || *buflen < tmplen) + if(!ber_write_id(p, buflen, 0x02) || !ber_write_len(p, buflen, tmplen) || *buflen < tmplen) { return false; + } memcpy(*p, tmpbuf, tmplen); *p += tmplen; @@ -160,18 +175,18 @@ bool rsa_write_pem_public_key(rsa_t *rsa, FILE *fp) { uint8_t derbuf2[8096]; uint8_t *derp1 = derbuf1; uint8_t *derp2 = derbuf2; - size_t derlen1 = sizeof derbuf1; - size_t derlen2 = sizeof derbuf2; + size_t derlen1 = sizeof(derbuf1); + size_t derlen2 = sizeof(derbuf2); if(!ber_write_mpi(&derp1, &derlen1, &rsa->n) - || !ber_write_mpi(&derp1, &derlen1, &rsa->e) - || !ber_write_sequence(&derp2, &derlen2, derbuf1, derlen1)) { - logger(LOG_ERR, "Error while encoding RSA public key"); + || !ber_write_mpi(&derp1, &derlen1, &rsa->e) + || !ber_write_sequence(&derp2, &derlen2, derbuf1, derlen1)) { + logger(DEBUG_ALWAYS, LOG_ERR, "Error while encoding RSA public key"); return false; } if(!pem_encode(fp, "RSA PUBLIC KEY", derbuf2, derlen2)) { - logger(LOG_ERR, "Unable to write RSA public key: %s", strerror(errno)); + logger(DEBUG_ALWAYS, LOG_ERR, "Unable to write RSA public key: %s", strerror(errno)); return false; } @@ -183,28 +198,30 @@ bool rsa_write_pem_private_key(rsa_t *rsa, FILE *fp) { uint8_t derbuf2[8096]; uint8_t *derp1 = derbuf1; uint8_t *derp2 = derbuf2; - size_t derlen1 = sizeof derbuf1; - size_t derlen2 = sizeof derbuf2; + size_t derlen1 = sizeof(derbuf1); + size_t derlen2 = sizeof(derbuf2); if(!ber_write_mpi(&derp1, &derlen1, &bits) - || ber_write_mpi(&derp1, &derlen1, &rsa->n) // modulus - || ber_write_mpi(&derp1, &derlen1, &rsa->e) // public exponent - || ber_write_mpi(&derp1, &derlen1, &rsa->d) // private exponent - || ber_write_mpi(&derp1, &derlen1, &p) - || ber_write_mpi(&derp1, &derlen1, &q) - || ber_write_mpi(&derp1, &derlen1, &exp1) - || ber_write_mpi(&derp1, &derlen1, &exp2) - || ber_write_mpi(&derp1, &derlen1, &coeff)) - logger(LOG_ERR, "Error while encoding RSA private key"); - return false; + || ber_write_mpi(&derp1, &derlen1, &rsa->n) // modulus + || ber_write_mpi(&derp1, &derlen1, &rsa->e) // public exponent + || ber_write_mpi(&derp1, &derlen1, &rsa->d) // private exponent + || ber_write_mpi(&derp1, &derlen1, &p) + || ber_write_mpi(&derp1, &derlen1, &q) + || ber_write_mpi(&derp1, &derlen1, &exp1) + || ber_write_mpi(&derp1, &derlen1, &exp2) + || ber_write_mpi(&derp1, &derlen1, &coeff)) { + logger(DEBUG_ALWAYS, LOG_ERR, "Error while encoding RSA private key"); } - if(!pem_encode(fp, "RSA PRIVATE KEY", derbuf2, derlen2)) { - logger(LOG_ERR, "Unable to write RSA private key: %s", strerror(errno)); - return false; - } + return false; +} - return true; +if(!pem_encode(fp, "RSA PRIVATE KEY", derbuf2, derlen2)) { + logger(DEBUG_ALWAYS, LOG_ERR, "Unable to write RSA private key: %s", strerror(errno)); + return false; +} + +return true; } #endif