* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $PostgreSQL: pgsql/contrib/pgcrypto/internal.c,v 1.15 2005/03/21 05:18:45 neilc Exp $
+ * $PostgreSQL: pgsql/contrib/pgcrypto/internal.c,v 1.16 2005/03/21 05:19:55 neilc Exp $
*/
else if (klen <= 256 / 8)
cx->keylen = 256 / 8;
else
- return -1;
+ return PXE_KEY_TOO_BIG;
memcpy(&cx->keybuf, key, klen);
if (!cx->is_init)
{
if (rj_real_init(cx, 1))
- return -1;
+ return PXE_CIPHER_INIT;
}
if (dlen == 0)
return 0;
if (dlen & 15)
- return -1;
+ return PXE_NOTBLOCKSIZE;
memcpy(res, data, dlen);
if (!cx->is_init)
if (rj_real_init(cx, 0))
- return -1;
+ return PXE_CIPHER_INIT;
if (dlen == 0)
return 0;
if (dlen & 15)
- return -1;
+ return PXE_NOTBLOCKSIZE;
memcpy(res, data, dlen);
return 0;
if (dlen & 7)
- return -1;
+ return PXE_NOTBLOCKSIZE;
memcpy(res, data, dlen);
switch (cx->mode)
return 0;
if (dlen & 7)
- return -1;
+ return PXE_NOTBLOCKSIZE;
memcpy(res, data, dlen);
switch (cx->mode)
return 0;
}
- return -1;
+ return PXE_NO_HASH;
}
int
}
if (c == NULL)
- return -1;
+ return PXE_NO_CIPHER;
*res = c;
return 0;
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $PostgreSQL: pgsql/contrib/pgcrypto/openssl.c,v 1.15 2005/03/21 05:18:45 neilc Exp $
+ * $PostgreSQL: pgsql/contrib/pgcrypto/openssl.c,v 1.16 2005/03/21 05:19:55 neilc Exp $
*/
#include <postgres.h>
md = EVP_get_digestbyname(name);
if (md == NULL)
- return -1;
+ return PXE_NO_HASH;
ctx = px_alloc(sizeof(*ctx));
EVP_DigestInit(ctx, md);
if (!strcmp(i->name, name))
break;
if (i->name == NULL)
- return -1;
+ return PXE_NO_CIPHER;
od = px_alloc(sizeof(*od));
memset(od, 0, sizeof(*od));
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $PostgreSQL: pgsql/contrib/pgcrypto/pgcrypto.c,v 1.17 2005/03/21 05:18:45 neilc Exp $
+ * $PostgreSQL: pgsql/contrib/pgcrypto/pgcrypto.c,v 1.18 2005/03/21 05:19:55 neilc Exp $
*/
#include "postgres.h"
pg_gen_salt(PG_FUNCTION_ARGS)
{
text *arg0;
- unsigned len;
+ int len;
text *res;
char buf[PX_MAX_SALT_LEN + 1];
memcpy(buf, VARDATA(arg0), len);
buf[len] = 0;
len = px_gen_salt(buf, buf, 0);
- if (len == 0)
+ if (len < 0)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
- errmsg("no such crypt algorithm")));
+ errmsg("gen_salt: %s", px_strerror(len))));
res = (text *) palloc(len + VARHDRSZ);
VARATT_SIZEP(res) = len + VARHDRSZ;
{
text *arg0;
int rounds;
- unsigned len;
+ int len;
text *res;
char buf[PX_MAX_SALT_LEN + 1];
memcpy(buf, VARDATA(arg0), len);
buf[len] = 0;
len = px_gen_salt(buf, buf, rounds);
- if (len == 0)
+ if (len < 0)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
- errmsg("no such crypt algorithm or bad number of rounds")));
+ errmsg("gen_salt: %s", px_strerror(len))));
res = (text *) palloc(len + VARHDRSZ);
VARATT_SIZEP(res) = len + VARHDRSZ;
pfree(res);
ereport(ERROR,
(errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
- errmsg("encrypt error: %d", err)));
+ errmsg("encrypt error: %s", px_strerror(err))));
}
VARATT_SIZEP(res) = VARHDRSZ + rlen;
if (err)
ereport(ERROR,
(errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
- errmsg("decrypt error: %d", err)));
+ errmsg("decrypt error: %s", px_strerror(err))));
VARATT_SIZEP(res) = VARHDRSZ + rlen;
if (err)
ereport(ERROR,
(errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
- errmsg("encrypt_iv error: %d", err)));
+ errmsg("encrypt_iv error: %s", px_strerror(err))));
VARATT_SIZEP(res) = VARHDRSZ + rlen;
if (err)
ereport(ERROR,
(errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION),
- errmsg("decrypt_iv error: %d", err)));
+ errmsg("decrypt_iv error: %s", px_strerror(err))));
VARATT_SIZEP(res) = VARHDRSZ + rlen;
if (err && !silent)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
- errmsg("%s type does not exist: \"%s\"", desc, buf)));
+ errmsg("Cannot use \"%s\": %s", buf, px_strerror(err))));
pfree(buf);
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $PostgreSQL: pgsql/contrib/pgcrypto/px-crypt.c,v 1.9 2005/03/21 05:18:45 neilc Exp $
+ * $PostgreSQL: pgsql/contrib/pgcrypto/px-crypt.c,v 1.10 2005/03/21 05:19:55 neilc Exp $
*/
#include <postgres.h>
{NULL, NULL, 0, 0, 0, 0}
};
-unsigned
+int
px_gen_salt(const char *salt_type, char *buf, int rounds)
{
- int i,
- res;
+ int res;
struct generator *g;
char *p;
char rbuf[16];
- for (i = 0; gen_list[i].name; i++)
- {
- g = &gen_list[i];
- if (pg_strcasecmp(g->name, salt_type) != 0)
- continue;
+ for (g = gen_list; g->name; g++)
+ if (pg_strcasecmp(g->name, salt_type) == 0)
+ break;
- if (g->def_rounds)
- {
- if (rounds == 0)
- rounds = g->def_rounds;
+ if (g->name == NULL)
+ return PXE_UNKNOWN_SALT_ALGO;
- if (rounds < g->min_rounds || rounds > g->max_rounds)
- return 0;
- }
+ if (g->def_rounds)
+ {
+ if (rounds == 0)
+ rounds = g->def_rounds;
- res = px_get_random_bytes(rbuf, g->input_len);
- if (res != g->input_len)
- return 0;
+ if (rounds < g->min_rounds || rounds > g->max_rounds)
+ return PXE_BAD_SALT_ROUNDS;
+ }
- p = g->gen(rounds, rbuf, g->input_len, buf, PX_MAX_SALT_LEN);
- memset(rbuf, 0, sizeof(rbuf));
+ res = px_get_random_bytes(rbuf, g->input_len);
+ if (res < 0)
+ return res;
- return p != NULL ? strlen(p) : 0;
- }
+ p = g->gen(rounds, rbuf, g->input_len, buf, PX_MAX_SALT_LEN);
+ memset(rbuf, 0, sizeof(rbuf));
+
+ if (p == NULL)
+ return PXE_BAD_SALT_ROUNDS;
- return 0;
+ return strlen(p);
}
+
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $PostgreSQL: pgsql/contrib/pgcrypto/px-crypt.h,v 1.6 2003/11/29 22:39:28 pgsql Exp $
+ * $PostgreSQL: pgsql/contrib/pgcrypto/px-crypt.h,v 1.7 2005/03/21 05:19:55 neilc Exp $
*/
#ifndef _PX_CRYPT_H
* main interface
*/
char *px_crypt(const char *psw, const char *salt, char *buf, unsigned buflen);
-unsigned px_gen_salt(const char *salt_type, char *dst, int rounds);
+int px_gen_salt(const char *salt_type, char *dst, int rounds);
/*
* internal functions
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $PostgreSQL: pgsql/contrib/pgcrypto/px-hmac.c,v 1.5 2003/11/29 22:39:28 pgsql Exp $
+ * $PostgreSQL: pgsql/contrib/pgcrypto/px-hmac.c,v 1.6 2005/03/21 05:19:55 neilc Exp $
*/
if (bs < 2)
{
px_md_free(md);
- return -1;
+ return PXE_HASH_UNUSABLE_FOR_HMAC;
}
h = px_alloc(sizeof(*h));
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $PostgreSQL: pgsql/contrib/pgcrypto/px.c,v 1.9 2004/05/07 00:24:57 tgl Exp $
+ * $PostgreSQL: pgsql/contrib/pgcrypto/px.c,v 1.10 2005/03/21 05:19:55 neilc Exp $
*/
#include <postgres.h>
#include "px.h"
+struct error_desc {
+ int err;
+ const char *desc;
+};
+
+static const struct error_desc px_err_list[] = {
+ {PXE_OK, "Everything ok"},
+ {PXE_ERR_GENERIC, "Some PX error (not specified)"},
+ {PXE_NO_HASH, "No such hash algorithm"},
+ {PXE_NO_CIPHER, "No such cipher algorithm"},
+ {PXE_NOTBLOCKSIZE, "Data not a multiple of block size"},
+ {PXE_BAD_OPTION, "Unknown option"},
+ {PXE_BAD_FORMAT, "Badly formatted type"},
+ {PXE_KEY_TOO_BIG, "Key was too big"},
+ {PXE_CIPHER_INIT, "Cipher cannot be initalized ?"},
+ {PXE_HASH_UNUSABLE_FOR_HMAC, "This hash algorithm is unusable for HMAC"},
+ {PXE_DEV_READ_ERROR, "Error reading from random device"},
+ {PXE_OSSL_RAND_ERROR, "OpenSSL PRNG error"},
+ {PXE_BUG, "pgcrypto bug"},
+ {PXE_ARGUMENT_ERROR, "Illegal argument to function"},
+ {PXE_UNKNOWN_SALT_ALGO, "Unknown salt algorithm"},
+ {PXE_BAD_SALT_ROUNDS, "Incorrect number of rounds"},
+ {PXE_MCRYPT_INTERNAL, "mcrypt internal error"},
+ {0, NULL},
+};
+
+const char *px_strerror(int err)
+{
+ const struct error_desc *e;
+ for (e = px_err_list; e->desc; e++)
+ if (e->err == err)
+ return e->desc;
+ return "Bad error code";
+}
+
const char *
px_resolve_alias(const PX_Alias * list, const char *name)
return 0;
- /* error reporting should be done in pgcrypto.c */
block_error:
- elog(WARNING, "Data not a multiple of block size");
- return -1;
+ return PXE_NOTBLOCKSIZE;
}
static void
if (!strcmp(p, "pad"))
*pad = p2;
else
- return -1;
+ return PXE_BAD_OPTION;
}
else
- return -1;
+ return PXE_BAD_FORMAT;
p = q;
}
px_cipher_free(cx->cipher);
px_free(cx);
px_free(buf);
- return -1;
+ return PXE_NO_CIPHER;
}
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $PostgreSQL: pgsql/contrib/pgcrypto/px.h,v 1.10 2005/03/21 05:18:46 neilc Exp $
+ * $PostgreSQL: pgsql/contrib/pgcrypto/px.h,v 1.11 2005/03/21 05:19:55 neilc Exp $
*/
#ifndef __PX_H
/* max salt returned */
#define PX_MAX_SALT_LEN 128
+/*
+ * PX error codes
+ */
+#define PXE_OK 0
+#define PXE_ERR_GENERIC -1
+#define PXE_NO_HASH -2
+#define PXE_NO_CIPHER -3
+#define PXE_NOTBLOCKSIZE -4
+#define PXE_BAD_OPTION -5
+#define PXE_BAD_FORMAT -6
+#define PXE_KEY_TOO_BIG -7
+#define PXE_CIPHER_INIT -8
+#define PXE_HASH_UNUSABLE_FOR_HMAC -9
+#define PXE_DEV_READ_ERROR -10
+#define PXE_OSSL_RAND_ERROR -11
+#define PXE_BUG -12
+#define PXE_ARGUMENT_ERROR -13
+#define PXE_UNKNOWN_SALT_ALGO -14
+#define PXE_BAD_SALT_ROUNDS -15
+#define PXE_MCRYPT_INTERNAL -16
typedef struct px_digest PX_MD;
typedef struct px_alias PX_Alias;
int px_get_random_bytes(uint8 *dst, unsigned count);
+const char *px_strerror(int err);
+
const char *px_resolve_alias(const PX_Alias * aliases, const char *name);
#define px_md_result_size(md) (md)->result_size(md)
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $PostgreSQL: pgsql/contrib/pgcrypto/random.c,v 1.8 2004/11/23 23:44:08 neilc Exp $
+ * $PostgreSQL: pgsql/contrib/pgcrypto/random.c,v 1.9 2005/03/21 05:19:55 neilc Exp $
*/
{
if (errno == EINTR)
continue;
- return -1;
+ return PXE_DEV_READ_ERROR;
}
p += res;
done += res;
fd = open(RAND_DEV, O_RDONLY);
if (fd == -1)
- return -1;
+ return PXE_DEV_READ_ERROR;
res = safe_read(fd, dst, count);
close(fd);
return res;
*/
res = RAND_bytes(dst, count);
- if (res > 0)
+ if (res == 1)
return count;
- return -1;
+ return PXE_OSSL_RAND_ERROR;
}
#else