summaryrefslogtreecommitdiff
path: root/contrib/pgcrypto/pgcrypto.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/pgcrypto/pgcrypto.c')
-rw-r--r--contrib/pgcrypto/pgcrypto.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/contrib/pgcrypto/pgcrypto.c b/contrib/pgcrypto/pgcrypto.c
index 4a2f37d95be..2bd9b21e167 100644
--- a/contrib/pgcrypto/pgcrypto.c
+++ b/contrib/pgcrypto/pgcrypto.c
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: pgcrypto.c,v 1.8 2001/08/21 00:42:41 momjian Exp $
+ * $Id: pgcrypto.c,v 1.9 2001/09/23 04:12:44 momjian Exp $
*/
#include <postgres.h>
@@ -200,7 +200,7 @@ pg_gen_salt(PG_FUNCTION_ARGS)
len = len > PX_MAX_SALT_LEN ? PX_MAX_SALT_LEN : len;
memcpy(buf, VARDATA(arg0), len);
buf[len] = 0;
- len = px_gen_salt(buf, buf);
+ len = px_gen_salt(buf, buf, 0);
if (len == 0)
elog(ERROR, "No such crypt algorithm");
@@ -213,6 +213,41 @@ pg_gen_salt(PG_FUNCTION_ARGS)
PG_RETURN_TEXT_P(res);
}
+/* SQL function: pg_gen_salt(text, int4) returns text */
+PG_FUNCTION_INFO_V1(pg_gen_salt_rounds);
+
+Datum
+pg_gen_salt_rounds(PG_FUNCTION_ARGS)
+{
+ text *arg0;
+ int rounds;
+ uint len;
+ text *res;
+ char buf[PX_MAX_SALT_LEN + 1];
+
+ if (PG_ARGISNULL(0) || PG_ARGISNULL(1))
+ PG_RETURN_NULL();
+
+ arg0 = PG_GETARG_TEXT_P(0);
+ rounds = PG_GETARG_INT32(1);
+
+ len = VARSIZE(arg0) - VARHDRSZ;
+ len = len > PX_MAX_SALT_LEN ? PX_MAX_SALT_LEN : len;
+ memcpy(buf, VARDATA(arg0), len);
+ buf[len] = 0;
+ len = px_gen_salt(buf, buf, rounds);
+ if (len == 0)
+ elog(ERROR, "No such crypt algorithm or bad number of rounds");
+
+ res = (text *) palloc(len + VARHDRSZ);
+ VARATT_SIZEP(res) = len + VARHDRSZ;
+ memcpy(VARDATA(res), buf, len);
+
+ PG_FREE_IF_COPY(arg0, 0);
+
+ PG_RETURN_TEXT_P(res);
+}
+
/* SQL function: pg_crypt(psw:text, salt:text) returns text */
PG_FUNCTION_INFO_V1(pg_crypt);