lib/rnp/ffi/librnp.rb in rnp-1.0.4 vs lib/rnp/ffi/librnp.rb in rnp-1.0.5
- old
+ new
@@ -1,27 +1,173 @@
# frozen_string_literal: true
-# (c) 2018 Ribose Inc.
+# (c) 2018-2020 Ribose Inc.
require 'ffi'
require 'rnp/error'
# @api private
module LibRnp
extend FFI::Library
- ffi_lib %w[rnp-0 rnp]
+ LOCAL_LIBRNP = File.join(File.dirname(__FILE__), FFI.map_library_name("rnp"))
+
+ ffi_lib [LOCAL_LIBRNP, "rnp-0", "rnp"]
+
+ # some newer APIs that may not be present
+ {
+ # key export
+ rnp_key_export: [%i[pointer pointer uint32], :uint32],
+ # enarmor/dearmor
+ rnp_enarmor: [%i[pointer pointer pointer], :uint32],
+ rnp_dearmor: [%i[pointer pointer], :uint32],
+ # versioning
+ rnp_version_string: [%i[], :string],
+ rnp_version_string_full: [%i[], :string],
+ rnp_version: [%i[], :uint32],
+ rnp_version_for: [%i[uint32 uint32 uint32], :uint32],
+ rnp_version_major: [%i[uint32], :uint32],
+ rnp_version_minor: [%i[uint32], :uint32],
+ rnp_version_patch: [%i[uint32], :uint32],
+ # unload keys
+ rnp_unload_keys: [%i[pointer uint32], :uint32],
+ # remove key
+ rnp_key_remove: [%i[pointer uint32], :uint32],
+ # key properties
+ rnp_key_get_subkey_count: [%i[pointer pointer], :uint32],
+ rnp_key_get_subkey_at: [%i[pointer int pointer], :uint32],
+ rnp_key_get_alg: [%i[pointer pointer], :uint32],
+ rnp_key_get_bits: [%i[pointer pointer], :uint32],
+ rnp_key_get_dsa_qbits: [%i[pointer pointer], :uint32],
+ rnp_key_get_curve: [%i[pointer pointer], :uint32],
+ rnp_key_allows_usage: [%i[pointer string pointer], :uint32],
+ # packet dumping
+ rnp_key_packets_to_json: [%i[pointer bool uint32 pointer], :uint32],
+ rnp_dump_packets_to_json: [%i[pointer uint32 pointer], :uint32],
+ # aead
+ rnp_op_encrypt_set_aead: [%i[pointer string], :uint32],
+ # key generation (op)
+ rnp_op_generate_create: [%i[pointer pointer string], :uint32],
+ rnp_op_generate_subkey_create: [%i[pointer pointer pointer string],
+ :uint32],
+ rnp_op_generate_set_bits: [%i[pointer uint32], :uint32],
+ rnp_op_generate_set_hash: [%i[pointer string], :uint32],
+ rnp_op_generate_set_dsa_qbits: [%i[pointer uint32], :uint32],
+ rnp_op_generate_set_curve: [%i[pointer string], :uint32],
+ rnp_op_generate_set_protection_password: [%i[pointer string], :uint32],
+ rnp_op_generate_set_protection_cipher: [%i[pointer string], :uint32],
+ rnp_op_generate_set_protection_hash: [%i[pointer string], :uint32],
+ rnp_op_generate_set_protection_mode: [%i[pointer string], :uint32],
+ rnp_op_generate_set_protection_iterations: [%i[pointer uint32], :uint32],
+ rnp_op_generate_add_usage: [%i[pointer string], :uint32],
+ rnp_op_generate_clear_usage: [%i[pointer], :uint32],
+ rnp_op_generate_set_userid: [%i[pointer string], :uint32],
+ rnp_op_generate_set_expiration: [%i[pointer uint32], :uint32],
+ rnp_op_generate_add_pref_hash: [%i[pointer string], :uint32],
+ rnp_op_generate_clear_pref_hashes: [%i[pointer], :uint32],
+ rnp_op_generate_add_pref_compression: [%i[pointer string], :uint32],
+ rnp_op_generate_clear_pref_compression: [%i[pointer], :uint32],
+ rnp_op_generate_add_pref_cipher: [%i[pointer string], :uint32],
+ rnp_op_generate_clear_pref_ciphers: [%i[pointer], :uint32],
+ rnp_op_generate_set_pref_keyserver: [%i[pointer pointer], :uint32],
+ rnp_op_generate_execute: [%i[pointer], :uint32],
+ rnp_op_generate_get_key: [%i[pointer pointer], :uint32],
+ rnp_op_generate_destroy: [%i[pointer], :uint32],
+ # key generation (shortcuts)
+ rnp_generate_key_rsa: [%i[pointer uint32 uint32 string string pointer],
+ :uint32],
+ rnp_generate_key_dsa_eg: [%i[pointer uint32 uint32 string string pointer],
+ :uint32],
+ rnp_generate_key_ec: [%i[pointer string string string pointer], :uint32],
+ rnp_generate_key_25519: [%i[pointer string string pointer], :uint32],
+ rnp_generate_key_sm2: [%i[pointer string string pointer], :uint32],
+ rnp_generate_key_ex: [%i[pointer string string uint32 uint32 string string
+ string string pointer], :uint32],
+ rnp_calculate_iterations: [%i[string size_t pointer], :uint32],
+ # debugging
+ rnp_enable_debug: [%i[pointer], :uint32],
+ rnp_disable_debug: [%i[], :uint32],
+ # guess contents
+ rnp_guess_contents: [%i[pointer pointer], :uint32],
+ # features
+ rnp_supports_feature: [%i[string string pointer], :uint32],
+ rnp_supported_features: [%i[string pointer], :uint32],
+ # key revocation
+ rnp_key_is_revoked: [%i[pointer pointer], :uint32],
+ rnp_key_is_compromised: [%i[pointer pointer], :uint32],
+ rnp_key_is_retired: [%i[pointer pointer], :uint32],
+ rnp_key_is_superseded: [%i[pointer pointer], :uint32],
+ rnp_key_get_revocation_reason: [%i[pointer pointer], :uint32],
+ # signatures
+ rnp_key_get_signature_count: [%i[pointer pointer], :uint32],
+ rnp_key_get_signature_at: [%i[pointer size_t pointer], :uint32],
+ rnp_signature_get_alg: [%i[pointer pointer], :uint32],
+ rnp_signature_get_hash_alg: [%i[pointer pointer], :uint32],
+ rnp_signature_get_creation: [%i[pointer pointer], :uint32],
+ rnp_signature_get_keyid: [%i[pointer pointer], :uint32],
+ rnp_signature_get_signer: [%i[pointer pointer], :uint32],
+ rnp_signature_packet_to_json: [%i[pointer uint32 pointer], :uint32],
+ rnp_signature_handle_destroy: [%i[pointer], :uint32],
+ rnp_op_verify_signature_get_handle: [%i[pointer pointer], :uint32],
+ # key uids
+ rnp_key_get_uid_handle_at: [%i[pointer size_t pointer], :uint32],
+ rnp_uid_is_revoked: [%i[pointer pointer], :uint32],
+ rnp_uid_handle_destroy: [%i[pointer], :uint32],
+ rnp_uid_get_signature_count: [%i[pointer pointer], :uint32],
+ rnp_uid_get_signature_at: [%i[pointer size_t pointer], :uint32],
+ # key properties
+ rnp_key_get_creation: [%i[pointer pointer], :uint32],
+ rnp_key_get_expiration: [%i[pointer pointer], :uint32],
+ rnp_key_get_primary_grip: [%i[pointer pointer], :uint32],
+ # output
+ rnp_output_write: [%i[pointer pointer size_t pointer], :uint32],
+ # import
+ rnp_import_keys: [%i[pointer pointer uint32 pointer], :uint32],
+ rnp_import_signatures: [%i[pointer pointer uint32 pointer], :uint32],
+ }.each do |name, signature|
+ present = !ffi_libraries[0].find_function(name.to_s).nil?
+ if !present
+ class_eval do
+ define_singleton_method(name) do |*|
+ raise Rnp::FeatureNotAvailableError, name
+ end
+ end
+ else
+ attach_function name, signature[0], signature[1]
+ end
+ class_eval do
+ const_set("HAVE_#{name.upcase}", present)
+ end
+ end
+
+ if ffi_libraries[0].find_function('rnp_version_commit_timestamp')
+ attach_function :rnp_version_commit_timestamp, [], :uint64
+ else
+ def self.rnp_version_commit_timestamp
+ 0
+ end
+ end
+
+ if HAVE_RNP_VERSION && (rnp_version >= rnp_version_for(0, 14, 0) ||
+ rnp_version_commit_timestamp >= 1585833163)
+ callback :rnp_input_reader_t,
+ %i[pointer pointer size_t pointer],
+ :bool
+ else
+ callback :rnp_input_reader_t,
+ %i[pointer pointer size_t],
+ :ssize_t
+ end
+
+
callback :rnp_get_key_cb,
%i[pointer pointer string string bool],
:void
callback :rnp_password_cb,
%i[pointer pointer pointer string pointer size_t],
:bool
- callback :rnp_input_reader_t,
- %i[pointer pointer size_t],
- :ssize_t
callback :rnp_output_writer_t,
%i[pointer pointer size_t],
:bool
attach_function :rnp_result_to_string,
@@ -287,52 +433,31 @@
:uint32
attach_function :rnp_identifier_iterator_destroy,
%i[pointer],
:uint32
- # some newer APIs that may not be present
- {
- # key export
- rnp_key_export: [%i[pointer pointer uint32], :uint32],
- # enarmor/dearmor
- rnp_enarmor: [%i[pointer pointer pointer], :uint32],
- rnp_dearmor: [%i[pointer pointer], :uint32],
- # versioning
- rnp_version_string: [%i[], :string],
- rnp_version_string_full: [%i[], :string],
- rnp_version: [%i[], :uint32],
- rnp_version_for: [%i[uint32 uint32 uint32], :uint32],
- rnp_version_major: [%i[uint32], :uint32],
- rnp_version_minor: [%i[uint32], :uint32],
- rnp_version_patch: [%i[uint32], :uint32]
- }.each do |name, signature|
- present = ffi_libraries[0].find_function(name.to_s)
- if !present
- class_eval do
- define_singleton_method(name) do |*|
- raise Rnp::FeatureNotAvailableError, name
- end
- end
- else
- attach_function name, signature[0], signature[1]
- end
- class_eval do
- const_set("HAVE_#{name.upcase}", present)
- end
- end
-
RNP_KEY_EXPORT_ARMORED = (1 << 0)
RNP_KEY_EXPORT_PUBLIC = (1 << 1)
RNP_KEY_EXPORT_SECRET = (1 << 2)
RNP_KEY_EXPORT_SUBKEYS = (1 << 3)
RNP_LOAD_SAVE_PUBLIC_KEYS = (1 << 0)
RNP_LOAD_SAVE_SECRET_KEYS = (1 << 1)
+ RNP_KEY_UNLOAD_PUBLIC = (1 << 0)
+ RNP_KEY_UNLOAD_SECRET = (1 << 1)
+
+ RNP_KEY_REMOVE_PUBLIC = (1 << 0)
+ RNP_KEY_REMOVE_SECRET = (1 << 1)
+
RNP_JSON_PUBLIC_MPIS = (1 << 0)
RNP_JSON_SECRET_MPIS = (1 << 1)
RNP_JSON_SIGNATURES = (1 << 2)
RNP_JSON_SIGNATURE_MPIS = (1 << 3)
+
+ RNP_JSON_DUMP_MPI = (1 << 0)
+ RNP_JSON_DUMP_RAW = (1 << 1)
+ RNP_JSON_DUMP_GRIP = (1 << 2)
RNP_SUCCESS = 0
RNP_ERROR_BAD_FORMAT = 0x10000001
RNP_ERROR_SIGNATURE_INVALID = 0x12000002
RNP_ERROR_BAD_PASSWORD = 0x12000004