decode_sign

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.