0
votes

Caught SQLException :: java.sql.SQLException: ORA-29532: Java call terminated by uncaught Java exception: java.sql.SQLException: Failed to get Server Access Account Details : ORA-28817: PL/SQL function returned an error.

ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 67

ORA-06512: at "SYS.DBMS_CRYPTO", line 44

ORA-06512: at "NM.CIPHER", line 41

ORA-06512: at "NM.DEVICE_ACCOUNT", line 176

ORA-06512: at line 1

ORA-06512: at "NM.DEVICE_PROCEDURES", line 8

ORA-06512: at line 1


Developed Code

create or replace PACKAGE BODY CIPHER IS
seven_bytes RAW(7) := HEXTORAW ('00000000000000');

FUNCTION    make_8_bytes (  p_string    IN  RAW ) RETURN RAW IS
    v_length    PLS_INTEGER := MOD(utl_raw.length (p_string),8);
BEGIN
    IF v_length = 0 THEN
        RETURN p_string;
    ELSE
        RETURN utl_raw.concat (p_string,utl_raw.substr(seven_bytes,1,8-v_length));
    END IF;
END;




FUNCTION    encrypt (   p_string    IN  VARCHAR2,
                                        p_key   IN  RAW  ) RETURN RAW IS
    encrypted_raw   RAW(2048);
    l_mod number := dbms_crypto.ENCRYPT_DES
                    + dbms_crypto.CHAIN_CBC
                    + dbms_crypto.PAD_PKCS5;

BEGIN
    --dbms_obfuscation_toolkit.DESEncrypt(input => make_8_bytes (utl_raw.cast_to_raw(p_string)),key => make_8_bytes (p_key), encrypted_data => encrypted_raw );
      encrypted_raw:= dbms_crypto.encrypt(src => make_8_bytes (utl_raw.cast_to_raw(p_string)),typ => l_mod, key => make_8_bytes (p_key));

    RETURN  encrypted_raw;
    
     EXCEPTION                
       WHEN OTHERS THEN 
                v_errm:=SUBSTR(SQLERRM,1,200);
END;


FUNCTION    decrypt (   p_string    IN  RAW,
                                        p_key   IN  RAW  ) RETURN VARCHAR2 IS
    decrypted_raw   RAW(2048);
    l_ret varchar2 (2000);
    l_mod number := dbms_crypto.ENCRYPT_DES
                    + dbms_crypto.CHAIN_CBC
                    + dbms_crypto.PAD_PKCS5;

BEGIN
       -- dbms_obfuscation_toolkit.DESDecrypt(input => p_string,key => make_8_bytes (p_key), decrypted_data => decrypted_raw );
        decrypted_raw:= dbms_crypto.Decrypt(src => p_string,typ => l_mod,key => make_8_bytes (p_key));
        l_ret:= UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8');
        RETURN l_ret;
    --RETURN rtrim(utl_raw.cast_to_varchar2(decrypted_raw),chr(0));
    
     EXCEPTION                
       WHEN OTHERS THEN 
                v_errm:=SUBSTR(SQLERRM,1,200);
END;
END CIPHER;
 
2
What does this have to do with Java? - Andreas
How about posting the full error stack, so we can see the real error message? - Andreas

2 Answers

0
votes

I tried your code and result is positive.

Error is thrown when I use different Keys for ENCRYPT and DECRYPT.

See the example below:

Same key for ENCRYPT and DECRYPT:

SELECT
    CIPHER.DECRYPT(CIPHER.ENCRYPT('stackoverflow', UTL_RAW.CAST_TO_RAW('123')), UTL_RAW.CAST_TO_RAW('123'))
FROM
    DUAL;

enter image description here

Different keys for ENCRYPT and DECRYPT:

SELECT
    CIPHER.DECRYPT(CIPHER.ENCRYPT('stackoverflow', UTL_RAW.CAST_TO_RAW('123')), UTL_RAW.CAST_TO_RAW('1234'))
FROM
    DUAL;

enter image description here

0
votes

When I use UTL_RAW for conversions to RAW I sometimes get the same error. It depends on value.

Regarding to the ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 67-error Oracle support recommends to use only RAWTOHEX or UTL_ENCODE.BASE64_ENCODE functions to pass value for decryption or for storing. And respectively HEXTORAW or UTL_ENCODE.BASE64_DECODE.