/* Prep and decrypt using gpgme */ static int gpg_decrypt(fko_ctx_t ctx, const char *dec_key) { char *tbuf; unsigned char *cipher; size_t cipher_len; int res; int b64_len = strlen(ctx->encrypted_msg); /* Now see if we need to add the "hQ" string to the front of the * base64-encoded-GPG-encrypted data. */ if(strncmp(ctx->encrypted_msg, B64_GPG_PREFIX, strlen(B64_GPG_PREFIX))) { /* We need to realloc space for the GPG prefix of hQ. */ tbuf = realloc(ctx->encrypted_msg, b64_len + 12); if(tbuf == NULL) return(FKO_ERROR_MEMORY_ALLOCATION); memmove(tbuf+strlen(B64_GPG_PREFIX), tbuf, b64_len); ctx->encrypted_msg = memcpy(tbuf, B64_GPG_PREFIX, strlen(B64_GPG_PREFIX)); /* Adjust b64_len for added SALT value and Make sure we are still * a properly NULL-terminated string (Ubuntu was one system for * which this was an issue). */ b64_len += strlen(B64_GPG_PREFIX); tbuf[b64_len] = '\0'; } /* Create a bucket for the (base64) decoded encrypted data and get the * raw cipher data. */ cipher = malloc(strlen(ctx->encrypted_msg)); if(cipher == NULL) return(FKO_ERROR_MEMORY_ALLOCATION); if((cipher_len = b64_decode(ctx->encrypted_msg, cipher)) < 0) return(FKO_ERROR_INVALID_DATA); /* Create a bucket for the plaintext data and decrypt the message * data into it. */ /* --DSS Actually, the needed memory will be malloced in the gpgme_decrypt // function. Just leaving this here for reference (for now). //ctx->encoded_msg = malloc(cipher_len); //if(ctx->encoded_msg == NULL) // return(FKO_ERROR_MEMORY_ALLOCATION); */ res = gpgme_decrypt(ctx, cipher, cipher_len, dec_key, (unsigned char**)&ctx->encoded_msg, &cipher_len ); /* Done with cipher... */ free(cipher); if(res != FKO_SUCCESS) return(res); /* XXX: We could put some kind of sanity check of the decrypted * data here */ /* Call fko_decode and return the results. */ return(fko_decode_spa_data(ctx)); }
/* Prep and decrypt using gpgme */ static int gpg_decrypt(fko_ctx_t ctx, const char *dec_key) { unsigned char *cipher; size_t cipher_len; int res, pt_len, b64_decode_len; /* Now see if we need to add the "hQ" string to the front of the * base64-encoded-GPG-encrypted data. */ if(! ctx->added_gpg_prefix) add_gpg_prefix(ctx); /* Create a bucket for the (base64) decoded encrypted data and get the * raw cipher data. */ cipher = malloc(ctx->encrypted_msg_len); if(cipher == NULL) return(FKO_ERROR_MEMORY_ALLOCATION); if((b64_decode_len = b64_decode(ctx->encrypted_msg, cipher)) < 0) { if(zero_free((char *) cipher, ctx->encrypted_msg_len) == FKO_SUCCESS) return(FKO_ERROR_INVALID_DATA_ENCRYPT_GPG_CIPHER_DECODEFAIL); else return(FKO_ERROR_ZERO_OUT_DATA); } cipher_len = b64_decode_len; /* Create a bucket for the plaintext data and decrypt the message * data into it. */ /* --DSS Actually, the needed memory will be malloced in the gpgme_decrypt // function. Just leaving this here for reference (for now). //ctx->encoded_msg = malloc(cipher_len); //if(ctx->encoded_msg == NULL) // return(FKO_ERROR_MEMORY_ALLOCATION); */ res = gpgme_decrypt(ctx, cipher, cipher_len, dec_key, (unsigned char**)&ctx->encoded_msg, &cipher_len ); /* Done with cipher... */ if(res != FKO_SUCCESS) { if(zero_free((char *) cipher, ctx->encrypted_msg_len) != FKO_SUCCESS) return(FKO_ERROR_ZERO_OUT_DATA); else return(res); } pt_len = strnlen(ctx->encoded_msg, MAX_SPA_ENCODED_MSG_SIZE); if(ctx->encoded_msg == NULL) return(FKO_ERROR_INVALID_DATA_ENCRYPT_DECRYPTED_MESSAGE_MISSING); if(! is_valid_encoded_msg_len(pt_len)) return(FKO_ERROR_INVALID_DATA_ENCRYPT_DECRYPTED_MSGLEN_VALIDFAIL); ctx->encoded_msg_len = pt_len; /* Call fko_decode and return the results. */ return(fko_decode_spa_data(ctx)); }