------------------------------------------------------------------------ -- Copyright (c) 2009 -- Ronald Peterson -- (Y) Yellowbank -- -- https://www.yellowbank.com/ -- -- There are no restrictions on the copying of this file. ------------------------------------------------------------------------ ------------------------------------------------------------------------ DROP FUNCTION y_mt_random_range( TEXT ); -- DROP FUNCTION y_bbs_random_seed( INTEGER, INTEGER ); DROP FUNCTION y_bbs_random_octets( INTEGER ); DROP FUNCTION y_bbs_random_range( TEXT ); -- DROP FUNCTION y_generate_rsa_keypair_bin( INTEGER, INTEGER ); DROP FUNCTION y_generate_rsa_keypair( INTEGER, INTEGER ); DROP FUNCTION y_rsa_encrypt( BYTEA, y_rsa_public_key ); DROP FUNCTION y_rsa_decrypt( TEXT, y_rsa_private_key ); DROP FUNCTION y_rsa_sign( BYTEA, y_rsa_private_key ); DROP FUNCTION y_rsa_sign_sha256( TEXT, y_rsa_private_key ); DROP FUNCTION y_rsa_verify( BYTEA, TEXT, y_rsa_public_key ); DROP FUNCTION y_rsa_verify_sha256( TEXT, TEXT, y_rsa_public_key ); DROP FUNCTION y_mpz_add( BYTEA, BYTEA ); DROP FUNCTION y_mpz_sub( BYTEA, BYTEA ); DROP FUNCTION y_mpz_mul( BYTEA, BYTEA ); -- DROP TYPE y_full_key; DROP TYPE y_part_key; DROP TYPE y_rsa_public_key; DROP TYPE y_rsa_private_key; -- DROP TYPE y_rsa_full_key_bin; DROP TYPE y_rsa_full_key; ------------------------------------------------------------------------ ------------------------------------------------------------------------ CREATE TYPE y_full_key AS ( n TEXT, e TEXT, d TEXT ); CREATE TYPE y_part_key AS ( n TEXT, e TEXT ); CREATE TYPE y_rsa_public_key AS ( n TEXT, e TEXT ); CREATE TYPE y_rsa_private_key as ( d TEXT, p TEXT, q TEXT, a TEXT, b TEXT, c TEXT ); -- CREATE TYPE y_rsa_full_key_bin as ( n BYTEA, e BYTEA, d BYTEA, p BYTEA, q BYTEA, a BYTEA, b BYTEA, c BYTEA ); CREATE TYPE y_rsa_full_key as ( n TEXT, e TEXT, d TEXT, p TEXT, q TEXT, a TEXT, b TEXT, c TEXT ); ------------------------------------------------------------------------ ------------------------------------------------------------------------ -- Mersenne Twister algorithm -- args: ceiling on the range of possible random numbers produced -- returns: random value in the range 0 to max-1, inclusive -- example: y_mt_random_range( 'ffffffffffffffffffffffffffff' ); -- CREATE OR REPLACE FUNCTION y_mt_random_range( TEXT ) RETURNS BYTEA AS 'y_crypto.so', 'y_mt_random_range' LANGUAGE C STRICT; ------------------------------------------------------------------------ ------------------------------------------------------------------------ -- Blum Blum Shub algorithm -- args: maximum value of random value used to seed x -- maximum value of random value used to seed p and q -- returns: true on successful completion, false on failure -- example: y_bbs_random_seed( 32, 32 ); -- CREATE OR REPLACE FUNCTION y_bbs_random_seed( INTEGER, INTEGER ) RETURNS BOOL AS 'y_crypto.so', 'y_bbs_random_seed' LANGUAGE C STRICT; -- args: number of octets of random data to produce -- returns: specified number of random octets -- example: y_bbs_random_octets( 32 ); -- CREATE OR REPLACE FUNCTION y_bbs_random_octets( INTEGER ) RETURNS BYTEA AS 'y_crypto.so', 'y_bbs_random_octets' LANGUAGE C STRICT; -- args: ceiling on the range of possible random numbers produced -- returns: random value in the range 0 to max-1, inclusive -- example: y_bbs_random_range( 'ffffffffffffffffffffffffffff' ); -- CREATE OR REPLACE FUNCTION y_bbs_random_range( TEXT ) RETURNS BYTEA AS 'y_crypto.so', 'y_bbs_random_range' LANGUAGE C STRICT; ------------------------------------------------------------------------ ------------------------------------------------------------------------ -- args: maximum random value as hexidecimal string -- returns: random value in the range 0 to max-1, inclusive -- example: y_random_hex( 'ffffffffffffffff' ); -- CREATE OR REPLACE FUNCTION -- y_random_hex( TEXT ) -- RETURNS -- TEXT -- AS -- 'y_crypto.so', 'y_random_hex' -- LANGUAGE -- C -- STRICT -- IMMUTABLE; ------------------------------------------------------------------------ ------------------------------------------------------------------------ -- args: data to encrypt, hash type -- returns: digest (hex) -- example: y_mhash( decode( 'deadbeef', 'hex' ), 'SHA256' ) CREATE OR REPLACE FUNCTION y_mhash( BYTEA, TEXT ) RETURNS BYTEA AS 'y_mhash.so', 'y_mhash' LANGUAGE C STRICT IMMUTABLE; ------------------------------------------------------------------------ ------------------------------------------------------------------------ -- args: key size in bits, public exponent (e) size in bits -- returns: ROW( n, e, d, p, q, a, b, c ) -- ...where n, e comprise the public half of the key, and -- d, p, q, a, b, c comprise the private half -- example: y_generate_rsa_keypair( 2048, 50 ) CREATE OR REPLACE FUNCTION y_generate_rsa_keypair( INTEGER DEFAULT 2048, INTEGER DEFAULT 67 ) RETURNS y_rsa_full_key AS 'y_crypto.so', 'y_generate_rsa_keypair' LANGUAGE C STRICT; ------------------------------------------------------------------------ ------------------------------------------------------------------------ -- args: message, ROW( n, e ) -- returns: encrypted message -- example: y_rsa_encrypt( '123abcd'::bytea, ROW( n, e ) ) -- ...where n, e obtained from previously generated key CREATE OR REPLACE FUNCTION y_rsa_encrypt( BYTEA, y_rsa_public_key ) RETURNS TEXT AS 'y_crypto.so', 'y_rsa_encrypt' LANGUAGE C STRICT; ------------------------------------------------------------------------ ------------------------------------------------------------------------ -- args: messageEncrypted as hex string, ROW( d, p, q, a, b, c ) -- returns: original message CREATE OR REPLACE FUNCTION y_rsa_decrypt( TEXT, y_rsa_private_key ) RETURNS BYTEA AS 'y_crypto.so', 'y_rsa_decrypt' LANGUAGE C STRICT IMMUTABLE; ------------------------------------------------------------------------ ------------------------------------------------------------------------ -- args: message, ROW( d, p, q, a, b, c ) -- returns: signature as hex string CREATE OR REPLACE FUNCTION y_rsa_sign( BYTEA, y_rsa_private_key ) RETURNS TEXT AS 'y_crypto.so', 'y_rsa_sign' LANGUAGE C STRICT; -- args: message sha256 digest (hex), ROW( d, p, q, a, b, c ) -- returns: signature as hex string CREATE OR REPLACE FUNCTION y_rsa_sign_sha256( TEXT, y_rsa_private_key ) RETURNS TEXT AS 'y_crypto.so', 'y_rsa_sign_sha256' LANGUAGE C STRICT; ------------------------------------------------------------------------ ------------------------------------------------------------------------ -- args: message, signature (hex), ROW( n, e ) -- returns: true (signature OK) or false (signature not OK) CREATE OR REPLACE FUNCTION y_rsa_verify( BYTEA, TEXT, y_rsa_public_key ) RETURNS BOOL AS 'y_crypto.so', 'y_rsa_verify' LANGUAGE C STRICT IMMUTABLE; -- args: message sha256 digest (hex), signature (hex), ROW( n, e ) -- returns: true (signature OK) or false (signature not OK) CREATE OR REPLACE FUNCTION y_rsa_verify_sha256( TEXT, TEXT, y_rsa_public_key ) RETURNS BOOL AS 'y_crypto.so', 'y_rsa_verify_sha256' LANGUAGE C STRICT IMMUTABLE; ------------------------------------------------------------------------ CREATE OR REPLACE FUNCTION y_mpz_add( BYTEA, BYTEA ) RETURNS BYTEA AS 'y_crypto.so', 'y_mpz_add_c' LANGUAGE C STRICT IMMUTABLE; CREATE OR REPLACE FUNCTION y_mpz_sub( BYTEA, BYTEA ) RETURNS BYTEA AS 'y_crypto.so', 'y_mpz_sub_c' LANGUAGE C STRICT IMMUTABLE; CREATE OR REPLACE FUNCTION y_mpz_mul( BYTEA, BYTEA ) RETURNS BYTEA AS 'y_crypto.so', 'y_mpz_mul_c' LANGUAGE C STRICT IMMUTABLE;