in src/zadf/zcl_adf_service.clas.abap [0:0]
METHOD decode_sign.
*This Include is to encrypt secrets with SSL client ID from STRUST *
*Framework Author : Krishna Chandra Dash *
* Sasidhar Puranam *
*----------------------------------------------------------------------*
DATA : lv_rfc_destination TYPE zrest_config-destination,
lv_srtfd TYPE zadf_con_indx-srtfd,
lw_indx TYPE zadf_con_indx,
lt_enveloped_data TYPE TABLE OF ssfbin,
lv_cert_string TYPE xstring,
lt_recipients TYPE TABLE OF ssfinfo,
lw_recipient TYPE ssfinfo,
lt_input_data TYPE TABLE OF ssfbin,
lw_input_data TYPE ssfbin,
lv_env_data_len TYPE i,
lv_env_len_total TYPE i,
lv_subject TYPE string,
lw_enveloped_data TYPE ssfbin,
lv_xstr_input TYPE xstring,
lv_len_output TYPE i,
lv_len_input TYPE i,
lt_decoded_bin TYPE TABLE OF x,
lv_decoded_str TYPE string,
lv_applic TYPE rfcdisplay-sslapplic,
lv_psename TYPE ssfpsename,
lv_profilename TYPE localfile,
lv_profile TYPE ssfparms-pab,
ssl_active TYPE rfcsnc.
lv_srtfd = gv_interface_id.
DEFINE decode_key.
*Import internal table as a cluster from INDX
IMPORT tab = lt_enveloped_data[]
FROM DATABASE zadf_con_indx(zd)
TO lw_indx
ID lv_srtfd.
IF NOT lt_enveloped_data[] IS INITIAL.
CLEAR lv_rfc_destination.
SELECT SINGLE destination FROM zrest_config
INTO lv_rfc_destination
WHERE interface_id EQ gv_interface_id.
IF NOT lv_rfc_destination IS INITIAL .
CALL FUNCTION 'RFC_READ_HTTP_DESTINATION'
EXPORTING
destination = lv_rfc_destination
authority_check = ' '
IMPORTING
sslapplic = lv_applic
ssl = ssl_active
EXCEPTIONS
authority_not_available = 1
destination_not_exist = 2
information_failure = 3
internal_failure = 4
no_http_destination = 5
OTHERS = 6.
IF sy-subrc NE 0.
RAISE EXCEPTION TYPE zcx_adf_service
EXPORTING
textid = zcx_adf_service=>read_error_rfc_destination
interface_id = gv_interface_id.
ENDIF.
if ssl_active <> abap_true.
RAISE EXCEPTION TYPE zcx_adf_service
EXPORTING
textid = zcx_adf_service=>RFC_DESTINATION_NO_SSL
rfc_destination = lv_rfc_destination
interface_id = gv_interface_id.
endif.
CALL FUNCTION 'SSFPSE_FILENAME'
EXPORTING
mandt = sy-mandt
context = 'SSLC'
applic = lv_applic
IMPORTING
psename = lv_psename
profile = lv_profilename
EXCEPTIONS
pse_not_found = 1
OTHERS = 2.
IF sy-subrc NE 0.
RAISE EXCEPTION TYPE zcx_adf_service
EXPORTING
textid = zcx_adf_service=>read_error_pse_filename
interface_id = gv_interface_id.
ENDIF.
IF NOT lv_psename IS INITIAL.
lv_profile = lv_psename.
CALL FUNCTION 'SSFC_GET_CERTIFICATE'
EXPORTING
profile = lv_profile
IMPORTING
certificate = lv_cert_string
EXCEPTIONS
ssf_krn_error = 1
ssf_krn_nomemory = 2
ssf_krn_nossflib = 3
ssf_krn_invalid_par = 4
ssf_krn_nocertificate = 5
OTHERS = 6.
IF sy-subrc NE 0.
**Addinng complete profile path for reading certificate instance
lv_profile = lv_profilename.
CALL FUNCTION 'SSFC_GET_CERTIFICATE'
EXPORTING
profile = lv_profile
IMPORTING
certificate = lv_cert_string
EXCEPTIONS
ssf_krn_error = 1
ssf_krn_nomemory = 2
ssf_krn_nossflib = 3
ssf_krn_invalid_par = 4
ssf_krn_nocertificate = 5
OTHERS = 6.
IF sy-subrc NE 0.
**Raise Exception
RAISE EXCEPTION TYPE zcx_adf_service
EXPORTING
textid = zcx_adf_service=>error_get_certificate_instance
interface_id = gv_interface_id.
ENDIF.
ENDIF.
CALL FUNCTION 'SSFC_PARSE_CERTIFICATE'
EXPORTING
certificate = lv_cert_string
IMPORTING
subject = lv_subject
EXCEPTIONS
ssf_krn_error = 1
ssf_krn_nomemory = 2
ssf_krn_nossflib = 3
ssf_krn_invalid_par = 4
OTHERS = 5.
IF sy-subrc NE 0.
**Raise Exception
RAISE EXCEPTION TYPE zcx_adf_service
EXPORTING
textid = zcx_adf_service=>error_attributes_certificate
interface_id = gv_interface_id.
ENDIF.
lw_recipient-id = lv_subject.
lw_recipient-profile = lv_profile.
APPEND lw_recipient TO lt_recipients.
LOOP AT lt_enveloped_data INTO lw_enveloped_data.
lv_env_data_len = xstrlen( lw_enveloped_data-bindata ).
lv_env_len_total = lv_env_len_total + lv_env_data_len.
CLEAR lw_enveloped_data.
ENDLOOP.
CALL FUNCTION 'SSF_KRN_DEVELOPE'
EXPORTING
ssftoolkit = 'SAPSECULIB'
str_format = 'PKCS7'
* B_OUTDEC = 'X'
* IO_SPEC = 'T'
ostr_enveloped_data_l = lv_env_len_total
IMPORTING
ostr_output_data_l = lv_len_input
* CRC =
TABLES
ostr_enveloped_data = lt_enveloped_data
recipient = lt_recipients
ostr_output_data = lt_input_data
EXCEPTIONS
ssf_krn_error = 1
ssf_krn_noop = 2
ssf_krn_nomemory = 3
ssf_krn_opinv = 4
ssf_krn_nossflib = 5
ssf_krn_recipient_error = 6
ssf_krn_input_data_error = 7
ssf_krn_invalid_par = 8
ssf_krn_invalid_parlen = 9
ssf_fb_input_parameter_error = 10
OTHERS = 11.
IF sy-subrc NE 0.
**Raise Exception
RAISE EXCEPTION TYPE zcx_adf_service
EXPORTING
textid = zcx_adf_service=>error_decode_sas_key
interface_id = gv_interface_id.
ENDIF.
IF NOT lt_input_data[] IS INITIAL.
CALL FUNCTION 'SCMS_BINARY_TO_STRING'
EXPORTING
input_length = lv_len_input
IMPORTING
text_buffer = lv_decoded_str
output_length = lv_len_output
TABLES
binary_tab = lt_input_data
EXCEPTIONS
failed = 1
OTHERS = 2.
IF lv_decoded_str IS INITIAL.
**Raise exception
RAISE EXCEPTION TYPE zcx_adf_service
EXPORTING
textid = zcx_adf_service=>error_con_saskey_string
interface_id = gv_interface_id.
ELSE.
rv_secret = lv_decoded_str.
ENDIF.
ELSE.
**Raise exception
RAISE EXCEPTION TYPE zcx_adf_service
EXPORTING
textid = zcx_adf_service=>error_read_encoded_saskey
interface_id = gv_interface_id.
ENDIF.
ENDIF.
ELSE.
RAISE EXCEPTION TYPE zcx_adf_service
EXPORTING
textid = zcx_adf_service=>rfc_destination_not_maintained
interface_id = gv_interface_id.
ENDIF.
ELSE.
**Raise Exception
RAISE EXCEPTION TYPE zcx_adf_service
EXPORTING
textid = zcx_adf_service=>error_import_sas_key
interface_id = gv_interface_id.
ENDIF.
IF rv_secret IS INITIAL.
RAISE EXCEPTION TYPE zcx_adf_service
EXPORTING
textid = zcx_adf_service=>sas_key_not_maintained
interface_id = gv_interface_id.
ENDIF.
END-OF-DEFINITION.
decode_key.