/* * @brief Decrypt all the encrypted values on an ldb_message_element * * Returns a copy of the original attribute with all values decrypted by * decrypt_value(), the original attribute is left intact. * * @param err Pointer to an error code, set to: * LDB_SUCESS If the value was successfully encrypted * LDB_ERR_OPERATIONS_ERROR If there was an error. * * @param ctx Talloc memory context the will own the memory allocated * for the new ldb_message_element. * @param ldb ldb context, to allow logging. * @param el The ldb_message_elemen to decrypt, not altered or freed * @param data The context data for this module. * * @return Pointer decrypted lsb_message_element, will be NULL if there was * an error. */ static struct ldb_message_element *decrypt_element( int *err, TALLOC_CTX *ctx, struct ldb_context *ldb, struct ldb_message_element* el, struct es_data *data) { int i; struct ldb_message_element* dec = talloc_zero(ctx, struct ldb_message_element); *err = LDB_SUCCESS; if (dec == NULL) { ldb_set_errstring(ldb, "Out of memory, allocating " "ldb_message_element\n"); *err = LDB_ERR_OPERATIONS_ERROR; return NULL; } dec->num_values = el->num_values; dec->values = talloc_array(dec, struct ldb_val, dec->num_values); if (dec->values == NULL) { TALLOC_FREE(dec); ldb_set_errstring(ldb, "Out of memory, allocating values array\n"); *err = LDB_ERR_OPERATIONS_ERROR; return NULL; } dec->name = talloc_strdup(dec, el->name); if (dec->name == NULL) { TALLOC_FREE(dec); ldb_set_errstring(ldb, "Out of memory, copying element name\n"); *err = LDB_ERR_OPERATIONS_ERROR; return NULL; } for (i = 0; i < el->num_values; i++) { dec->values[i] = decrypt_value(err, el->values, ldb, el->values[i], data); if (*err != LDB_SUCCESS) { TALLOC_FREE(dec); return NULL; } } return dec; }
void baconian_decrypt(FILE *input) { int c; int _c; int i; int value[BITS]; while ((c = fgetc(input)) != EOF) { _c = c; if (isalpha(c)) { c = toupper(c); if (!OKCHAR(c)) unexpected_char(_c); value[BITS - 1] = (c == 'A') ? 0 : 1; for (i = BITS - 2; i >= 0; i--) { c = fgetc(input); if (c == EOF) { fprintf(stderr, "unexpected end of input\n"); exit(1); } _c = c; if (isalpha(c)) { c = toupper(c); if (!OKCHAR(c)) unexpected_char(_c); value[i] = (c == 'A') ? 0 : 1; } else { unexpected_char(_c); } } c = 'A' + decrypt_value(value); } fputc(c, stdout); } }