Jerry 2010年CFCA POC源代码

*&---------------------------------------------------------------------*
*& Report  /SF0A0001/CFCA_EN_DE_TEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  /SF0A0001/CFCA_EN_DE_TEST.


PARAMETERS: file TYPE localfile OBLIGATORY DEFAULT 'C:and Settingsf_435.xml',
            passwd TYPE /sf0a0001/cfca_string DEFAULT 'i042416' OBLIGATORY.
TYPES ty_content_line TYPE x LENGTH 1024.

DATA: lv_client_file_content TYPE xstring,
      lv_origin_file_content TYPE xstring,
      lv_final_content TYPE xstring,
      lv_client_private_content TYPE xstring,
      lv_subject TYPE /sf0a0001/cfca_string,
      lv_issuer TYPE /sf0a0001/cfca_string,
      lv_serial TYPE /sf0a0001/cfca_string,
      lv_rc TYPE i,
      lv_origin_file_path TYPE string,
      lv_decry TYPE xstring,
      lv_date_valid TYPE i,
      lv_file_length TYPE i,
      lt_doc_download            TYPE STANDARD TABLE OF sdok_sdatx,
      l_table_wa                 TYPE REF TO data,
      lv_signature TYPE i,
      lt_content TYPE STANDARD TABLE OF ty_content_line .

FIELD-SYMBOLS:
                <l_table_wa_flat>  TYPE any,
                <l_table_wa_struc> TYPE any.

DATA: RFCDEST like rfcdes-rfcdest VALUE 'JCO'. "corresponds to the destination namedefined in the SM59

START-OF-SELECTION.

cl_gui_frontend_services=>gui_upload(
      EXPORTING
        filename                = 'C:and Settings.cer'
        filetype                = 'BIN'
      IMPORTING
        filelength              = lv_file_length
      CHANGING
        data_tab                = lt_content
      EXCEPTIONS
        file_open_error         = 1
        file_read_error         = 2
        no_batch                = 3
        gui_refuse_filetransfer = 4
        invalid_type            = 5
        no_authority            = 6
        unknown_error           = 7
        bad_data_format         = 8
        header_not_allowed      = 9
        separator_not_allowed   = 10
        header_too_long         = 11
        unknown_dp_error        = 12
        access_denied           = 13
        dp_out_of_memory        = 14
        disk_full               = 15
        dp_timeout              = 16
        not_supported_by_gui    = 17
        error_no_gui            = 18
        OTHERS                  = 19
           ).
    IF sy-subrc = 1.
      WRITE:/ 'Please make sure Client1.cer is stored in desktop!'.
      RETURN.
    ELSE.
      ASSERT sy-subrc = 0.
    ENDIF.
    ASSERT lt_content IS NOT INITIAL.

    CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
        EXPORTING
          input_length = lv_file_length
        IMPORTING
          buffer       = lv_client_file_content
        TABLES
          binary_tab   = lt_content
        EXCEPTIONS
          failed       = 1
          OTHERS       = 2.
    ASSERT sy-subrc = 0.

    "********************** Upload Original file ****************************
    CLEAR: lt_content.
    lv_origin_file_path = file.
    cl_gui_frontend_services=>gui_upload(
      EXPORTING
        filename                = lv_origin_file_path
        filetype                = 'BIN'
      IMPORTING
        filelength              = lv_file_length
      CHANGING
        data_tab                = lt_content
      EXCEPTIONS
        file_open_error         = 1
        file_read_error         = 2
        no_batch                = 3
        gui_refuse_filetransfer = 4
        invalid_type            = 5
        no_authority            = 6
        unknown_error           = 7
        bad_data_format         = 8
        header_not_allowed      = 9
        separator_not_allowed   = 10
        header_too_long         = 11
        unknown_dp_error        = 12
        access_denied           = 13
        dp_out_of_memory        = 14
        disk_full               = 15
        dp_timeout              = 16
        not_supported_by_gui    = 17
        error_no_gui            = 18
        OTHERS                  = 19
           ).

    IF sy-subrc = 1.
       WRITE:/ 'Can not open file:' , lv_origin_file_path.
       RETURN.
    ELSE.
       ASSERT sy-subrc = 0.
    ENDIF.
    ASSERT lt_content IS NOT INITIAL.

    CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
        EXPORTING
          input_length = lv_file_length
        IMPORTING
          buffer       = lv_origin_file_content
        TABLES
          binary_tab   = lt_content
        EXCEPTIONS
          failed       = 1
          OTHERS       = 2.
    ASSERT sy-subrc = 0.

    CALL FUNCTION '/SF0A0001/ENCRY_FILE'
      DESTINATION RFCDEST
        EXPORTING
           IN_CLIENT_FILE_CONTENT = lv_client_file_content
           IN_ORIGINAL_FILE_CONTENT = lv_origin_file_content
        IMPORTING
           OUT_ENCRIED_FILE_CONTENT = lv_decry
           out_rc = lv_rc.

    WRITE:/ lv_rc.

    ASSERT lv_decry IS NOT INITIAL.

    "download
    lv_file_length = xstrlen( lv_decry ).

    CREATE DATA l_table_wa LIKE LINE OF lt_doc_download.

    ASSIGN l_table_wa->* TO <l_table_wa_struc>.
    ASSIGN l_table_wa->* TO <l_table_wa_flat> CASTING TYPE x.

    DATA l_length TYPE i.
    l_length = 0.

    WHILE lv_file_length > l_length.
       <l_table_wa_flat> = lv_decry+l_length.
       l_length = l_length + 1022.  "1022 = table width
       APPEND <l_table_wa_struc> TO lt_doc_download[].
    ENDWHILE.

  lv_origin_file_path = lv_origin_file_path && '.enc'.

  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      bin_filesize            = lv_file_length
      filename                = lv_origin_file_path
      filetype                = 'BIN'
    TABLES
      data_tab                = lt_doc_download
*     FIELDNAMES              =
    EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      no_authority            = 5
      unknown_error           = 6
      header_not_allowed      = 7
      separator_not_allowed   = 8
      filesize_not_allowed    = 9
      header_too_long         = 10
      dp_error_create         = 11
      dp_error_send           = 12
      dp_error_write          = 13
      unknown_dp_error        = 14
      access_denied           = 15
      dp_out_of_memory        = 16
      disk_full               = 17
      dp_timeout              = 18
      file_not_found          = 19
      dataprovider_exception  = 20
      control_flush_error     = 21
      OTHERS                  = 22.
  IF sy-subrc = 0.
    WRITE: / '***************** ENCry Senario *************'.
    WRITE: / 'Encryied File Generate successfully!'. "#EC NOTEXT
  ENDIF.

  WRITE:/ 'Encry Return Code:' , lv_rc.

  " test with decry now
  " upload private key
  CLEAR: lt_content.
  cl_gui_frontend_services=>gui_upload(
      EXPORTING
        filename                = 'C:and Settings.pfx'
        filetype                = 'BIN'
      IMPORTING
        filelength              = lv_file_length
      CHANGING
        data_tab                = lt_content
      EXCEPTIONS
        file_open_error         = 1
        file_read_error         = 2
        no_batch                = 3
        gui_refuse_filetransfer = 4
        invalid_type            = 5
        no_authority            = 6
        unknown_error           = 7
        bad_data_format         = 8
        header_not_allowed      = 9
        separator_not_allowed   = 10
        header_too_long         = 11
        unknown_dp_error        = 12
        access_denied           = 13
        dp_out_of_memory        = 14
        disk_full               = 15
        dp_timeout              = 16
        not_supported_by_gui    = 17
        error_no_gui            = 18
        OTHERS                  = 19
           ).
    IF sy-subrc = 1.
      WRITE:/ 'Please make sure client Private Key file is stored in desktop!'.
      RETURN.
    ELSE.
      ASSERT sy-subrc = 0.
    ENDIF.
    ASSERT lt_content IS NOT INITIAL.

    CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
        EXPORTING
          input_length = lv_file_length
        IMPORTING
          buffer       = lv_client_private_content
        TABLES
          binary_tab   = lt_content
        EXCEPTIONS
          failed       = 1
          OTHERS       = 2.
    ASSERT sy-subrc = 0.

    CALL FUNCTION '/SF0A0001/DECRY_FILE'
      DESTINATION RFCDEST
        EXPORTING
           IN_ENCRY_FILE = lv_decry
           IN_PRIVATE_KEY_FILE = lv_client_private_content
           IN_PASSWD = passwd
        IMPORTING
           OUT_DECRY_FILE = lv_final_content
           out_rc = lv_rc.

    BREAK-POINT.
*&---------------------------------------------------------------------*
*& Report  /SF0A0001/CFCA_VERIFY_SIGN
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  /SF0A0001/CFCA_VERIFY_SIGN.


TYPES ty_content_line TYPE x LENGTH 1024.

DATA: lv_client_file_content TYPE xstring,
      lv_ca_file_content TYPE xstring,
      lv_subject TYPE /sf0a0001/cfca_string,
      lv_issuer TYPE /sf0a0001/cfca_string,
      lv_serial TYPE /sf0a0001/cfca_string,
      lv_rc TYPE i,
      lv_date_valid TYPE i,
      lv_file_length TYPE i,
      lv_signature TYPE i,
      lv_client_d TYPE /sf0a0001/cfca_c,
      lt_content TYPE STANDARD TABLE OF ty_content_line .

DATA: RFCDEST like rfcdes-rfcdest VALUE 'JCO'. "corresponds to the destination namedefined in the SM59

START-OF-SELECTION.

cl_gui_frontend_services=>gui_upload(
      EXPORTING
        filename                = 'C:and Settings.cer'
        filetype                = 'BIN'
      IMPORTING
        filelength              = lv_file_length
      CHANGING
        data_tab                = lt_content
      EXCEPTIONS
        file_open_error         = 1
        file_read_error         = 2
        no_batch                = 3
        gui_refuse_filetransfer = 4
        invalid_type            = 5
        no_authority            = 6
        unknown_error           = 7
        bad_data_format         = 8
        header_not_allowed      = 9
        separator_not_allowed   = 10
        header_too_long         = 11
        unknown_dp_error        = 12
        access_denied           = 13
        dp_out_of_memory        = 14
        disk_full               = 15
        dp_timeout              = 16
        not_supported_by_gui    = 17
        error_no_gui            = 18
        OTHERS                  = 19
           ).
    IF sy-subrc = 1.
      WRITE:/ 'Please make sure Client1.cer is stored in desktop!'.
      RETURN.
    ELSE.
      ASSERT sy-subrc = 0.
    ENDIF.
    ASSERT lt_content IS NOT INITIAL.

    CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
        EXPORTING
          input_length = lv_file_length
        IMPORTING
          buffer       = lv_client_file_content
        TABLES
          binary_tab   = lt_content
        EXCEPTIONS
          failed       = 1
          OTHERS       = 2.
    ASSERT sy-subrc = 0.

SELECT SINGLE * INTO lv_client_d FROM /sf0a0001/cfca_c.
ASSERT sy-subrc = 0.

CALL FUNCTION '/SF0A0001/CERT_VERIFY'
DESTINATION RFCDEST
  EXPORTING
     IN_CLIENT_FILE_CONTENT = lv_client_file_content
     IN_CA_FILE_CONTENT = lv_client_d-file_content
  IMPORTING
     OUT_SUBJECT         = lv_subject
     OUT_issuer          = lv_issuer
     out_serial_number   = lv_serial
     out_rc              = lv_rc
     OUT_DATE_VALID      = lv_date_valid
     OUT_SIGNATURE_CHECK = lv_signature.

ASSERT sy-subrc = 0.
WRITE:/ lv_rc.
WRITE:/ 'Subject:' ,lv_subject.
WRITE:/ lv_issuer.
WRITE:/ lv_serial.
WRITE:/ lv_date_valid.

*&---------------------------------------------------------------------*
*& Report  /SF0A0001/MAINTAIN_CA
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  /SF0A0001/MAINTAIN_CA.

CONSTANTS: CA_FILE_NAME TYPE STRING VALUE 'CA_FILE'.
PARAMETERS:
  cafile TYPE localfile OBLIGATORY.

DATA: ls_ca TYPE /SF0A0001/CFCA_C,
      lv_file TYPE xstring.

START-OF-SELECTION.

  SELECT SINGLE * INTO ls_ca FROM /SF0A0001/CFCA_C WHERE FILE_NAME = CA_FILE_NAME.

  IF sy-subrc = 0.
     DELETE /SF0A0001/CFCA_C FROM ls_ca.
     ASSERT sy-subrc = 0.
     CLEAR: ls_ca.
  ENDIF.

  PERFORM upload CHANGING lv_file.
  ls_ca-file_name = ca_file_name.
  ls_ca-file_content = lv_file.
  INSERT /SF0A0001/CFCA_C FROM ls_ca.
  COMMIT WORK AND WAIT.
  ASSERT sy-subrc = 0.
  WRITE:/ 'CA Uploaded Successful!'.

********************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR cafile.
  DATA:
    file_table  TYPE filetable,
    action TYPE i,
    rc TYPE sysubrc.

  FIELD-SYMBOLS:
    <file> TYPE file_table.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      default_extension       = 'cer'
      "file_filter             = cl_gui_frontend_services=>filetype_xml
    CHANGING
      file_table              = file_table
      rc                      = rc
      user_action             = action
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  CHECK action = cl_gui_frontend_services=>action_ok.

  READ TABLE file_table INDEX 1 ASSIGNING <file>.

  cafile = <file>.

  FORM upload CHANGING content TYPE xstring.
    TYPES ty_content_line TYPE x LENGTH 1024.
    DATA:
          lv_file_length TYPE i,
          file TYPE string,
          lt_content TYPE STANDARD TABLE OF ty_content_line .

    file = cafile.

    cl_gui_frontend_services=>gui_upload(
      EXPORTING
        filename                = file
        filetype                = 'BIN'
      IMPORTING
        filelength              = lv_file_length
      CHANGING
        data_tab                = lt_content
      EXCEPTIONS
        file_open_error         = 1
        file_read_error         = 2
        no_batch                = 3
        gui_refuse_filetransfer = 4
        invalid_type            = 5
        no_authority            = 6
        unknown_error           = 7
        bad_data_format         = 8
        header_not_allowed      = 9
        separator_not_allowed   = 10
        header_too_long         = 11
        unknown_dp_error        = 12
        access_denied           = 13
        dp_out_of_memory        = 14
        disk_full               = 15
        dp_timeout              = 16
        not_supported_by_gui    = 17
        error_no_gui            = 18
        OTHERS                  = 19
           ).
    ASSERT sy-subrc = 0.
    ASSERT lt_content IS NOT INITIAL.

    CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
        EXPORTING
          input_length = lv_file_length
        IMPORTING
          buffer       = content
        TABLES
          binary_tab   = lt_content
        EXCEPTIONS
          failed       = 1
          OTHERS       = 2.
    ASSERT sy-subrc = 0.
  ENDFORM.

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

发布了6372 篇原创文章 · 获赞 621 · 访问量 101万+

猜你喜欢

转载自blog.csdn.net/i042416/article/details/104034334