EVP_PKEY_CTX_CTRL(3SSL)

الاسم
EVP_PKEY_CTX_ctrl, EVP_PKEY_CTX_ctrl_str, EVP_PKEY_CTX_ctrl_uint64, EVP_PKEY_CTX_md, EVP_PKEY_CTX_set_signature_md, EVP_PKEY_CTX_get_signature_md, EVP_PKEY_CTX_set_mac_key, EVP_PKEY_CTX_set_group_name, EVP_PKEY_CTX_get_group_name, EVP_PKEY_CTX_set_rsa_padding, EVP_PKEY_CTX_get_rsa_padding, EVP_PKEY_CTX_set_rsa_pss_saltlen, EVP_PKEY_CTX_get_rsa_pss_saltlen, EVP_PKEY_CTX_set_rsa_keygen_bits, EVP_PKEY_CTX_set_rsa_keygen_pubexp, EVP_PKEY_CTX_set1_rsa_keygen_pubexp, EVP_PKEY_CTX_set_rsa_keygen_primes, EVP_PKEY_CTX_set_rsa_mgf1_md_name, EVP_PKEY_CTX_set_rsa_mgf1_md, EVP_PKEY_CTX_get_rsa_mgf1_md, EVP_PKEY_CTX_get_rsa_mgf1_md_name, EVP_PKEY_CTX_set_rsa_oaep_md_name, EVP_PKEY_CTX_set_rsa_oaep_md, EVP_PKEY_CTX_get_rsa_oaep_md, EVP_PKEY_CTX_get_rsa_oaep_md_name, EVP_PKEY_CTX_set0_rsa_oaep_label, EVP_PKEY_CTX_get0_rsa_oaep_label, EVP_PKEY_CTX_set_dsa_paramgen_bits, EVP_PKEY_CTX_set_dsa_paramgen_q_bits, EVP_PKEY_CTX_set_dsa_paramgen_md, EVP_PKEY_CTX_set_dsa_paramgen_md_props, EVP_PKEY_CTX_set_dsa_paramgen_gindex, EVP_PKEY_CTX_set_dsa_paramgen_type, EVP_PKEY_CTX_set_dsa_paramgen_seed, EVP_PKEY_CTX_set_dh_paramgen_prime_len, EVP_PKEY_CTX_set_dh_paramgen_subprime_len, EVP_PKEY_CTX_set_dh_paramgen_generator, EVP_PKEY_CTX_set_dh_paramgen_type, EVP_PKEY_CTX_set_dh_paramgen_gindex, EVP_PKEY_CTX_set_dh_paramgen_seed, EVP_PKEY_CTX_set_dh_rfc5114, EVP_PKEY_CTX_set_dhx_rfc5114, EVP_PKEY_CTX_set_dh_pad, EVP_PKEY_CTX_set_dh_nid, EVP_PKEY_CTX_set_dh_kdf_type, EVP_PKEY_CTX_get_dh_kdf_type, EVP_PKEY_CTX_set0_dh_kdf_oid, EVP_PKEY_CTX_get0_dh_kdf_oid, EVP_PKEY_CTX_set_dh_kdf_md, EVP_PKEY_CTX_get_dh_kdf_md, EVP_PKEY_CTX_set_dh_kdf_outlen, EVP_PKEY_CTX_get_dh_kdf_outlen, EVP_PKEY_CTX_set0_dh_kdf_ukm, EVP_PKEY_CTX_get0_dh_kdf_ukm, EVP_PKEY_CTX_set_ec_paramgen_curve_nid, EVP_PKEY_CTX_set_ec_param_enc, EVP_PKEY_CTX_set_ecdh_cofactor_mode, EVP_PKEY_CTX_get_ecdh_cofactor_mode, EVP_PKEY_CTX_set_ecdh_kdf_type, EVP_PKEY_CTX_get_ecdh_kdf_type, EVP_PKEY_CTX_set_ecdh_kdf_md, EVP_PKEY_CTX_get_ecdh_kdf_md, EVP_PKEY_CTX_set_ecdh_kdf_outlen, EVP_PKEY_CTX_get_ecdh_kdf_outlen, EVP_PKEY_CTX_set0_ecdh_kdf_ukm, EVP_PKEY_CTX_get0_ecdh_kdf_ukm, EVP_PKEY_CTX_set1_id, EVP_PKEY_CTX_get1_id, EVP_PKEY_CTX_get1_id_len, EVP_PKEY_CTX_set_kem_op - عمليات تحكم خاصة بالخوارزمية

موجز
 #include <openssl/evp.h>

 int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype,
                       int cmd, int p1, void *p2);
 int EVP_PKEY_CTX_ctrl_uint64(EVP_PKEY_CTX *ctx, int keytype, int optype,
                              int cmd, uint64_t value);
 int EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX *ctx, const char *type,
                           const char *value);

 int EVP_PKEY_CTX_md(EVP_PKEY_CTX *ctx, int optype, int cmd, const char *md);

 int EVP_PKEY_CTX_set_signature_md(EVP_PKEY_CTX *ctx, const EVP_MD *md);
 int EVP_PKEY_CTX_get_signature_md(EVP_PKEY_CTX *ctx, const EVP_MD **pmd);

 int EVP_PKEY_CTX_set_mac_key(EVP_PKEY_CTX *ctx, const unsigned char *key,
                              int len);
 int EVP_PKEY_CTX_set_group_name(EVP_PKEY_CTX *ctx, const char *name);
 int EVP_PKEY_CTX_get_group_name(EVP_PKEY_CTX *ctx, char *name, size_t namelen);

 int EVP_PKEY_CTX_set_kem_op(EVP_PKEY_CTX *ctx, const char *op);

 #include <openssl/rsa.h>

 int EVP_PKEY_CTX_set_rsa_padding(EVP_PKEY_CTX *ctx, int pad);
 int EVP_PKEY_CTX_get_rsa_padding(EVP_PKEY_CTX *ctx, int *pad);
 int EVP_PKEY_CTX_set_rsa_pss_saltlen(EVP_PKEY_CTX *ctx, int saltlen);
 int EVP_PKEY_CTX_get_rsa_pss_saltlen(EVP_PKEY_CTX *ctx, int *saltlen);
 int EVP_PKEY_CTX_set_rsa_keygen_bits(EVP_PKEY_CTX *ctx, int mbits);
 int EVP_PKEY_CTX_set1_rsa_keygen_pubexp(EVP_PKEY_CTX *ctx, BIGNUM *pubexp);
 int EVP_PKEY_CTX_set_rsa_keygen_primes(EVP_PKEY_CTX *ctx, int primes);
 int EVP_PKEY_CTX_set_rsa_mgf1_md_name(EVP_PKEY_CTX *ctx, const char *mdname,
                                     const char *mdprops);
 int EVP_PKEY_CTX_set_rsa_mgf1_md(EVP_PKEY_CTX *ctx, const EVP_MD *md);
 int EVP_PKEY_CTX_get_rsa_mgf1_md(EVP_PKEY_CTX *ctx, const EVP_MD **md);
 int EVP_PKEY_CTX_get_rsa_mgf1_md_name(EVP_PKEY_CTX *ctx, char *name,
                                       size_t namelen);
 int EVP_PKEY_CTX_set_rsa_oaep_md_name(EVP_PKEY_CTX *ctx, const char *mdname,
                                       const char *mdprops);
 int EVP_PKEY_CTX_set_rsa_oaep_md(EVP_PKEY_CTX *ctx, const EVP_MD *md);
 int EVP_PKEY_CTX_get_rsa_oaep_md(EVP_PKEY_CTX *ctx, const EVP_MD **md);
 int EVP_PKEY_CTX_get_rsa_oaep_md_name(EVP_PKEY_CTX *ctx, char *name,
                                       size_t namelen);
 int EVP_PKEY_CTX_set0_rsa_oaep_label(EVP_PKEY_CTX *ctx, void *label,
                                      int len);
 int EVP_PKEY_CTX_get0_rsa_oaep_label(EVP_PKEY_CTX *ctx, unsigned char **label);

 #include <openssl/dsa.h>

 int EVP_PKEY_CTX_set_dsa_paramgen_bits(EVP_PKEY_CTX *ctx, int nbits);
 int EVP_PKEY_CTX_set_dsa_paramgen_q_bits(EVP_PKEY_CTX *ctx, int qbits);
 int EVP_PKEY_CTX_set_dsa_paramgen_md(EVP_PKEY_CTX *ctx, const EVP_MD *md);
 int EVP_PKEY_CTX_set_dsa_paramgen_md_props(EVP_PKEY_CTX *ctx,
                                            const char *md_name,
                                            const char *md_properties);
 int EVP_PKEY_CTX_set_dsa_paramgen_type(EVP_PKEY_CTX *ctx, const char *name);
 int EVP_PKEY_CTX_set_dsa_paramgen_gindex(EVP_PKEY_CTX *ctx, int gindex);
 int EVP_PKEY_CTX_set_dsa_paramgen_seed(EVP_PKEY_CTX *ctx,
                                        const unsigned char *seed,
                                        size_t seedlen);

 #include <openssl/dh.h>

 int EVP_PKEY_CTX_set_dh_paramgen_prime_len(EVP_PKEY_CTX *ctx, int len);
 int EVP_PKEY_CTX_set_dh_paramgen_subprime_len(EVP_PKEY_CTX *ctx, int len);
 int EVP_PKEY_CTX_set_dh_paramgen_generator(EVP_PKEY_CTX *ctx, int gen);
 int EVP_PKEY_CTX_set_dh_paramgen_type(EVP_PKEY_CTX *ctx, int type);
 int EVP_PKEY_CTX_set_dh_pad(EVP_PKEY_CTX *ctx, int pad);
 int EVP_PKEY_CTX_set_dh_nid(EVP_PKEY_CTX *ctx, int nid);
 int EVP_PKEY_CTX_set_dh_rfc5114(EVP_PKEY_CTX *ctx, int rfc5114);
 int EVP_PKEY_CTX_set_dhx_rfc5114(EVP_PKEY_CTX *ctx, int rfc5114);
 int EVP_PKEY_CTX_set_dh_paramgen_gindex(EVP_PKEY_CTX *ctx, int gindex);
 int EVP_PKEY_CTX_set_dh_paramgen_seed(EVP_PKEY_CTX *ctx,
                                        const unsigned char *seed,
                                        size_t seedlen);
 int EVP_PKEY_CTX_set_dh_kdf_type(EVP_PKEY_CTX *ctx, int kdf);
 int EVP_PKEY_CTX_get_dh_kdf_type(EVP_PKEY_CTX *ctx);
 int EVP_PKEY_CTX_set0_dh_kdf_oid(EVP_PKEY_CTX *ctx, ASN1_OBJECT *oid);
 int EVP_PKEY_CTX_get0_dh_kdf_oid(EVP_PKEY_CTX *ctx, ASN1_OBJECT **oid);
 int EVP_PKEY_CTX_set_dh_kdf_md(EVP_PKEY_CTX *ctx, const EVP_MD *md);
 int EVP_PKEY_CTX_get_dh_kdf_md(EVP_PKEY_CTX *ctx, const EVP_MD **md);
 int EVP_PKEY_CTX_set_dh_kdf_outlen(EVP_PKEY_CTX *ctx, int len);
 int EVP_PKEY_CTX_get_dh_kdf_outlen(EVP_PKEY_CTX *ctx, int *len);
 int EVP_PKEY_CTX_set0_dh_kdf_ukm(EVP_PKEY_CTX *ctx, unsigned char *ukm, int len);

 #include <openssl/ec.h>

 int EVP_PKEY_CTX_set_ec_paramgen_curve_nid(EVP_PKEY_CTX *ctx, int nid);
 int EVP_PKEY_CTX_set_ec_param_enc(EVP_PKEY_CTX *ctx, int param_enc);
 int EVP_PKEY_CTX_set_ecdh_cofactor_mode(EVP_PKEY_CTX *ctx, int cofactor_mode);
 int EVP_PKEY_CTX_get_ecdh_cofactor_mode(EVP_PKEY_CTX *ctx);
 int EVP_PKEY_CTX_set_ecdh_kdf_type(EVP_PKEY_CTX *ctx, int kdf);
 int EVP_PKEY_CTX_get_ecdh_kdf_type(EVP_PKEY_CTX *ctx);
 int EVP_PKEY_CTX_set_ecdh_kdf_md(EVP_PKEY_CTX *ctx, const EVP_MD *md);
 int EVP_PKEY_CTX_get_ecdh_kdf_md(EVP_PKEY_CTX *ctx, const EVP_MD **md);
 int EVP_PKEY_CTX_set_ecdh_kdf_outlen(EVP_PKEY_CTX *ctx, int len);
 int EVP_PKEY_CTX_get_ecdh_kdf_outlen(EVP_PKEY_CTX *ctx, int *len);
 int EVP_PKEY_CTX_set0_ecdh_kdf_ukm(EVP_PKEY_CTX *ctx, unsigned char *ukm, int len);

 int EVP_PKEY_CTX_set1_id(EVP_PKEY_CTX *ctx, void *id, size_t id_len);
 int EVP_PKEY_CTX_get1_id(EVP_PKEY_CTX *ctx, void *id);
 int EVP_PKEY_CTX_get1_id_len(EVP_PKEY_CTX *ctx, size_t *id_len);

الدوال التالية أصبحت مهجورة منذ OpenSSL 3.0، ويمكن إخفاؤها تماماً عن طريق تعريف OPENSSL_API_COMPAT بقيمة إصدار مناسبة، انظر openssl_user_macros(7):

 #include <openssl/rsa.h>

 int EVP_PKEY_CTX_set_rsa_keygen_pubexp(EVP_PKEY_CTX *ctx, BIGNUM *pubexp);

 #include <openssl/dh.h>

 int EVP_PKEY_CTX_get0_dh_kdf_ukm(EVP_PKEY_CTX *ctx, unsigned char **ukm);

 #include <openssl/ec.h>

 int EVP_PKEY_CTX_get0_ecdh_kdf_ukm(EVP_PKEY_CTX *ctx, unsigned char **ukm);

الوصف
تُرسِل الدالة EVP_PKEY_CTX_ctrl() عملية تحكم إلى السياق ctx. يجب أن يطابق نوع المفتاح المُستخدَم keytype إذا لم يكن -1. المعامل optype هو قناع يُشير إلى أي العمليات يمكن تطبيق التحكم عليها. يُشار إلى أمر التحكم في cmd وأي وسائط إضافية في p1 و p2.

بالنسبة لـ cmd = EVP_PKEY_CTRL_SET_MAC_KEY، فإن p1 هو طول مفتاح MAC، و p2 هو مفتاح MAC. يُستخدم هذا بواسطة Poly1305 و SipHash و HMAC و CMAC.

لن تستدعي التطبيقات عادةً EVP_PKEY_CTX_ctrl() مباشرةً بل ستستدعي بدلاً من ذلك إحدى الدوال الخاصة بالخوارزمية أدناه.

الدالة EVP_PKEY_CTX_ctrl_uint64() هي غلاف يُمرر قيمة uint64 مباشرةً كـ p2 إلى EVP_PKEY_CTX_ctrl().

تسمح الدالة EVP_PKEY_CTX_ctrl_str() للتطبيق بإرسال عملية تحكم خاصة بخوارزمية إلى سياق ctx في شكل سلسلة محارف. هذا مُعد للاستخدام مع الخيارات المُحددة في سطر الأوامر أو في ملفات نصية. الأوامر المدعومة مُوثقة في صفحات سطر أوامر أداة openssl للخيار -pkeyopt المدعوم بواسطة أوامر pkeyutl و genpkey و req.

تُرسِل الدالة EVP_PKEY_CTX_md() عملية تحكم لمستخلص الرسالة إلى السياق ctx. يُحدد مستخلص الرسالة باسمه md.

تضبط الدالة EVP_PKEY_CTX_set_signature_md() نوع مستخلص الرسالة المُستخدم في توقيع. يمكن استخدامها في خوارزميات RSA و DSA و ECDSA.

تحصل الدالة EVP_PKEY_CTX_get_signature_md() على نوع مستخلص الرسالة المُستخدم في توقيع. يمكن استخدامها في خوارزميات RSA و DSA و ECDSA.

يتضمن توليد المفاتيح عادةً إعداد المعاملات المراد استخدامها وتوليد بيانات المفتاح الخاص والعام. تسمح بعض تطبيقات الخوارزمية بتعيين بيانات المفتاح الخاص صراحةً باستخدام EVP_PKEY_CTX_set_mac_key(). في هذه الحالة، يكون توليد المفتاح ببساطة هو عملية إعداد معاملات المفتاح ثم تعيين بيانات المفتاح الخام إلى القيمة صراحةً. عادةً، ستستدعي التطبيقات EVP_PKEY_new_raw_private_key(3) أو دوال مشابهة بدلاً من ذلك.

يمكن استخدام الدالة EVP_PKEY_CTX_set_mac_key() مع أي من الخوارزميات المدعومة بواسطة الدالة EVP_PKEY_new_raw_private_key(3).

تضبط الدالة EVP_PKEY_CTX_set_group_name() اسم المجموعة إلى name لتوليد المعاملات والمفاتيح. على سبيل المثال، بالنسبة لمفاتيح EC، سيضبط هذا اسم المنحنى، وبالنسبة لمفاتيح DH، سيضبط اسم مجموعة الحقل المحدود.

EVP_PKEY_CTX_get_group_name() يجد اسم المجموعة المُعيّن حاليًا مع ctx، ويكتبه في الموقع الذي يشير إليه name، طالما أن حجمه namelen كبير كافٍ لتخزين ذلك الاسم، بما في ذلك بايت NUL الختامي.

  معاملات RSA
تضبط الدالة EVP_PKEY_CTX_set_rsa_padding() وضع حشو RSA لـ ctx. يمكن للمعامل pad أن يأخذ القيمة RSA_PKCS1_PADDING لحشو PKCS#1، و RSA_NO_PADDING لعدم وجود حشو، و RSA_PKCS1_OAEP_PADDING لحشو OAEP (التعمية وفك التعمية فقط)، و RSA_X931_PADDING لحشو X9.31 (عمليات التوقيع فقط)، و RSA_PKCS1_PSS_PADDING (التوقيع والتحقق فقط)، و RSA_PKCS1_WITH_TLS_PADDING لحشو رسالة TLS RSA ClientKeyExchange (فك التعمية فقط).

يتصرف وضعا حشو RSA بشكل مختلف إذا استُخدمت EVP_PKEY_CTX_set_signature_md(). إذا استُدعيت هذه الدالة لحشو PKCS#1، فإن المخزن المؤقت للنص العادي هو قيمة مستخلص فعلية وتُغلّف في بنية DigestInfo وفقًا لـ PKCS#1 عند التوقيع، وتُتوقع هذه البنية (وتُزال) عند التحقق. إذا لم يُستخدم هذا التحكم مع RSA وحشو PKCS#1، فإن البيانات المُقدمة تُستخدم مباشرةً ولا تُغلّف. في حالة حشو X9.31 لـ RSA، يُضاف بايت معرف الخوارزمية أو يُفحص ويُزال إذا استُدعي هذا التحكم. إذا لم يُستدعَ، فإن البايت الأول من المخزن المؤقت للنص العادي يُتوقع أن يكون بايت معرف الخوارزمية.

EVP_PKEY_CTX_get_rsa_padding() يحصل على وضع حشو RSA لـ ctx.

EVP_PKEY_CTX_set_rsa_pss_saltlen() يضبط طول ملح RSA PSS إلى saltlen. كما يوحي اسمه، فهو مدعوم فقط لحشو PSS. إذا لم تُستدعَ هذه الدالة، فسيُعظّم طول الملح حتى طول الملخص عند التوقيع، ويُكتشف آليًا عند التحقق. أربع قيم خاصة مدعومة:

RSA_PSS_SALTLEN_DIGEST
    يضبط طول الملح إلى طول الملخص.

RSA_PSS_SALTLEN_MAX
    يضبط طول الملح إلى أقصى قيمة مسموح بها.

RSA_PSS_SALTLEN_AUTO
    يُسبب تحديد طول الملح آليًا بناءً على بنية كتلة PSS عند التحقق. عند التوقيع، له نفس معنى RSA_PSS_SALTLEN_MAX.

RSA_PSS_SALTLEN_AUTO_DIGEST_MAX
    يُسبب تحديد طول الملح آليًا بناءً على بنية كتلة PSS عند التحقق، مثل RSA_PSS_SALTLEN_AUTO. عند التوقيع، يُعظّم طول الملح حتى أقصى طول للملخص للامتثال لـ FIPS 186-4 القسم 5.5.

EVP_PKEY_CTX_get_rsa_pss_saltlen() يحصل على طول ملح RSA PSS لـ ctx. يجب أن يكون وضع الحشو قد ضُبط مسبقًا على RSA_PKCS1_PSS_PADDING.

EVP_PKEY_CTX_set_rsa_keygen_bits() يضبط طول مفتاح RSA لتوليد مفتاح RSA إلى bits. إذا لم يُحدد، يُستخدم 2048 بت.

EVP_PKEY_CTX_set1_rsa_keygen_pubexp() يضبط قيمة الأس العام لتوليد مفتاح RSA إلى القيمة المخزنة في pubexp. حاليًا، يجب أن يكون عددًا صحيحًا فرديًا. وفقًا لاتفاقية تسمية OpenSSL، يجب تحرير مؤشر pubexp بشكل مستقل عن EVP_PKEY_CTX (أي، يُنسخ داخليًا). إذا لم يُحدد، يُستخدم 65537.

EVP_PKEY_CTX_set_rsa_keygen_pubexp() يفعل نفس EVP_PKEY_CTX_set1_rsa_keygen_pubexp() باستثناء عدم وجود نسخ داخلي، وبالتالي لا ينبغي تعديل pubexp أو تحريره بعد الاستدعاء.

EVP_PKEY_CTX_set_rsa_keygen_primes() يضبط عدد الأعداد الأولية لتوليد مفتاح RSA إلى primes. إذا لم يُحدد، يُستخدم 2.

EVP_PKEY_CTX_set_rsa_mgf1_md_name() يضبط ملخص MGF1 لمخططات حشو RSA إلى الملخص المسمى mdname. إذا كان تنفيذ خوارزمية RSA للمزوّد المحدد يدعم ذلك، فسيُجلب الملخص باستخدام الخصائص mdprops. إذا لم يُضبط صراحةً، يُستخدم ملخص التوقيع. يجب أن يكون وضع الحشو قد ضُبط على RSA_PKCS1_OAEP_PADDING أو RSA_PKCS1_PSS_PADDING.

EVP_PKEY_CTX_set_rsa_mgf1_md() يفعل نفس EVP_PKEY_CTX_set_rsa_mgf1_md_name() باستثناء أن اسم المُعمِّي يُستنتج من md المُقدم ولا يمكن تحديد أي خصائص.

EVP_PKEY_CTX_get_rsa_mgf1_md_name() يحصل على اسم خوارزمية المُعمِّي MGF1 لـ ctx. إذا لم يُضبط صراحة، يُستخدم مُعمِّي التوقيع. يجب أن يكون نمط الحشو قد ضُبط على RSA_PKCS1_OAEP_PADDING أو RSA_PKCS1_PSS_PADDING.

EVP_PKEY_CTX_get_rsa_mgf1_md() يفعل نفس EVP_PKEY_CTX_get_rsa_mgf1_md_name() باستثناء أنه يُرجع مؤشرًا لكائن EVP_MD بدلاً من ذلك. لاحظ أنه سيُعاد فقط كائنات EVP_MD المعروفة والمضمنة. قد يكون كائن EVP_MD NULL إذا لم يكن المُعمِّي واحدًا منها (مثل مُعمِّي مُنفَّذ فقط في موفر طرف ثالث).

EVP_PKEY_CTX_set_rsa_oaep_md_name() يضبط نوع مُعمِّي الرسالة المستخدم في RSA OAEP على المُعمِّي المُسمى mdname. إذا كان تنفيذ خوارزمية RSA للموفر المحدد يدعمه، فسيُجلب المُعمِّي باستخدام الخصائص mdprops. يجب أن يكون نمط الحشو قد ضُبط على RSA_PKCS1_OAEP_PADDING.

EVP_PKEY_CTX_set_rsa_oaep_md() يفعل نفس EVP_PKEY_CTX_set_rsa_oaep_md_name() باستثناء أن اسم المُعمِّي يُستنتج من md المُقدم ولا يمكن تحديد أي خصائص.

EVP_PKEY_CTX_get_rsa_oaep_md_name() يحصل على اسم خوارزمية مُعمِّي الرسالة المستخدم في RSA OAEP ويخزنه في المخزن المؤقت name بحجم namelen. يجب أن يكون نمط الحشو قد ضُبط على RSA_PKCS1_OAEP_PADDING. يجب أن يكون المخزن المؤقت كبيرًا بما يكفي لأي أسماء خوارزميات مُعمِّي متوقعة وإلا ستفشل الدالة.

EVP_PKEY_CTX_get_rsa_oaep_md() يفعل نفس EVP_PKEY_CTX_get_rsa_oaep_md_name() باستثناء أنه يُرجع مؤشرًا لكائن EVP_MD بدلاً من ذلك. لاحظ أنه سيُعاد فقط كائنات EVP_MD المعروفة والمضمنة. قد يكون كائن EVP_MD NULL إذا لم يكن المُعمِّي واحدًا منها (مثل مُعمِّي مُنفَّذ فقط في موفر طرف ثالث).

EVP_PKEY_CTX_set0_rsa_oaep_label() يضبط تسمية RSA OAEP على البيانات الثنائية label وطولها بالبايت على len. إذا كان label NULL أو len 0، فتُمسح التسمية. تأخذ المكتبة ملكية التسمية لذا لا ينبغي للمتصل تحرير الذاكرة الأصلية المُشار إليها بـ label. يجب أن يكون نمط الحشو قد ضُبط على RSA_PKCS1_OAEP_PADDING.

EVP_PKEY_CTX_get0_rsa_oaep_label() يحصل على تسمية RSA OAEP إلى label. قيمة الإرجاع هي طول التسمية. يجب أن يكون نمط الحشو قد ضُبط على RSA_PKCS1_OAEP_PADDING. المؤشر الناتج مملوك للمكتبة ولا ينبغي للمتصل تحريره.

RSA_PKCS1_WITH_TLS_PADDING يُستخدم عند فك تعمية سر ما قبل الرئيسي لـ TLS المُعمَّى بـ RSA في رسالة ClientKeyExchange لـ TLS. هو نفس RSA_PKCS1_PADDING باستثناء أنه يتحقق إضافيًا من أن النتيجة بالطول الصحيح وأن أول بايتين هما إصدار البروتوكول الذي طلبه العميل مبدئيًا. إذا كان المحتوى المُعمَّى غير صالح علنًا، فسيفشل فك التعمية. ومع ذلك، إذا فشلت فحوصات الحشو، فسيظل فك التعمية يبدو ناجحًا ولكن سيُعاد سر ما قبل رئيسي عشوائي لـ TLS بدلاً من ذلك. يقبل نمط الحشو هذا معاملين يمكن ضبطهما باستخدام الدالة EVP_PKEY_CTX_set_params(3). هما OSSL_ASYM_CIPHER_PARAM_TLS_CLIENT_VERSION و OSSL_ASYM_CIPHER_PARAM_TLS_NEGOTIATED_VERSION، وكلاهما يُتوقع أن يكونا أعدادًا صحيحة غير موقعة. عادةً، سيُضبط الأول فقط ويمثل إصدار بروتوكول TLS الذي طلبه العميل أولاً (مثل 0x0303 لـ TLSv1.2، 0x0302 لـ TLSv1.1 إلخ). تاريخيًا، استخدم بعض العملاء ذوو الأخطاء إصدار البروتوكول المُفاوَض بدلاً من إصدار البروتوكول المطلوب أولاً. إذا كان يجب تحمل هذا السلوك، فيجب ضبط OSSL_ASYM_CIPHER_PARAM_TLS_NEGOTIATED_VERSION على إصدار البروتوكول المُفاوَض الفعلي. وإلا، فيجب تركه غير مضبوط.

على غرار RSA_PKCS1_WITH_TLS_PADDING أعلاه، منذ إصدار OpenSSL 3.2.0، استخدام RSA_PKCS1_PADDING سيعيد رسالة مولّدة آليًا بدلاً من أخطاء الحشو في حال فشلت فحوصات الحشو. التطبيقات التي ترغب في البقاء آمنة أثناء استخدام إصدارات أقدم من OpenSSL، أو مزود لا ينفّذ آلية الرفض الضمني، لا تزال بحاجة إلى معالجة كل من رمز الخطأ من عملية فك التشفير RSA والرسالة المُعادة بطريقة آمنة للقناة الجانبية. هذه الحماية ضد هجمات Bleichenbacher يمكن تعطيلها بضبط OSSL_ASYM_CIPHER_PARAM_IMPLICIT_REJECTION (عدد صحيح غير مُوقّع) إلى 0.

  معاملات DSA
EVP_PKEY_CTX_set_dsa_paramgen_bits() يضبط عدد البتات المستخدمة لتوليد معاملات DSA على nbits. إذا لم يُحدد، يُستخدم 2048.

EVP_PKEY_CTX_set_dsa_paramgen_q_bits() يضبط عدد البتات في المعامل الفرعي الأولي q لتوليد معاملات DSA على qbits. إذا لم يُحدد، يُستخدم 224. إذا حُددت دالة مُعمِّي أدناه، يُتجاهل هذا المعامل وبدلاً من ذلك، يطابق عدد البتات في q حجم المُعمِّي.

EVP_PKEY_CTX_set_dsa_paramgen_md() يضبط دالة المُعمِّي المستخدمة لتوليد معاملات DSA على md. إذا لم تُحدد، يُختار واحد من SHA-1 أو SHA-224 أو SHA-256 ليطابق طول البت لـ q أعلاه.

EVP_PKEY_CTX_set_dsa_paramgen_md_props() يضبط دالة التجزئة المستخدمة لتوليد معاملات DSA باستخدام md_name و md_properties لاسترداد التجزئة من مزود. إذا لم يُحدد، سيُضبط md_name على أحد SHA-1 أو SHA-224 أو SHA-256 اعتمادًا على طول البت لـ q أعلاه. md_properties هي سلسلة استعلام خصائص بقيمة مبدئية ” إذا لم تُحدد.

EVP_PKEY_CTX_set_dsa_paramgen_gindex() يضبط gindex المستخدم بواسطة المولد G. القيمة المبدئية هي -1 التي تستخدم g غير قابل للتحقق، وإلا فإن القيمة الموجبة تستخدم g قابل للتحقق. يجب حفظ هذه القيمة إذا كان التحقق من صحة المفتاح لـ g مطلوبًا، لأنها ليست جزءًا من مفتاح مستمر.

EVP_PKEY_CTX_set_dsa_paramgen_seed() يضبط seed لاستخدامه في التوليد بدلاً من استخدام قيمة مولدة عشوائيًا للبذرة. هذا مفيد لأغراض الاختبار فقط وقد يفشل إذا لم تُنتج البذرة أعدادًا أولية لكل من p و q في تكرارها الأول. يجب حفظ هذه القيمة إذا كان التحقق من صحة المفتاح p و q و g القابل للتحقق مطلوبًا، لأنها ليست جزءًا من مفتاح مستمر.

تضبط الدالة EVP_PKEY_CTX_set_dsa_paramgen_type() نوع التوليد لاستخدام توليد FIPS186-4 إذا كان name هو "fips186_4"، أو توليد FIPS186-2 إذا كان name هو "fips186_2". القيمة المبدئية للمزود المبدئي هي "fips186_2". القيمة المبدئية لمزود FIPS هي "fips186_4".

  معاملات DH
EVP_PKEY_CTX_set_dh_paramgen_prime_len() يضبط طول معامل العدد الأولي DH p لتوليد معاملات DH. إذا لم تُستدعَ هذه الدالة، يُستخدم 2048. تقبل فقط أطوالًا أكبر من أو تساوي 256.

EVP_PKEY_CTX_set_dh_paramgen_subprime_len() يضبط طول معامل العدد الأولي الفرعي الاختياري q لتوليد معاملات DH. المبدئي هو 256 إذا كان العدد الأولي بطول 2048 بت على الأقل، أو 160 بخلاف ذلك. يجب أن يكون نوع توليد معاملات DH قد ضُبط على "fips186_4".

EVP_PKEY_CTX_set_dh_paramgen_generator() يضبط مولد DH على gen لتوليد معاملات DH. إذا لم يُحدد، يُستخدم 2.

EVP_PKEY_CTX_set_dh_paramgen_type() يضبط نوع المفتاح لتوليد معاملات DH. المعاملات المدعومة هي:

DH_PARAMGEN_TYPE_GROUP
    استخدم مجموعة مسماة. إذا ضُبط معامل العدد الأولي الآمن p فقط، يمكن استخدام هذا لاختيار مجموعة عدد أولي آمن ffdhe بالحجم الصحيح.

DH_PARAMGEN_TYPE_FIPS_186_4
    مولد معاملات FFC FIPS186-4.

DH_PARAMGEN_TYPE_FIPS_186_2
    مولد معاملات FFC FIPS186-2 (X9.42 DH).

DH_PARAMGEN_TYPE_GENERATOR
    يستخدم مولد عدد أولي آمن g (تنسيق PKCS#3).

المبدئي في المزوّد المبدئي هو DH_PARAMGEN_TYPE_GENERATOR لنوع المفتاح "DH"، وDH_PARAMGEN_TYPE_FIPS_186_2 لنوع المفتاح "DHX". في مزوّد FIPS، القيمة المبدئية هي DH_PARAMGEN_TYPE_GROUP لنوع المفتاح "DH" و<DH_PARAMGEN_TYPE_FIPS_186_4 لنوع المفتاح "DHX".

EVP_PKEY_CTX_set_dh_paramgen_gindex() يضبط gindex المستخدم بواسطة المولد G. القيمة المبدئية هي -1 والتي تستخدم g غير قابل للتحقق، وإلا فإن القيمة الموجبة تستخدم g قابل للتحقق. يجب حفظ هذه القيمة إذا كان التحقق من صحة المفتاح g مطلوبًا، لأنها ليست جزءًا من مفتاح مستمر.

EVP_PKEY_CTX_set_dh_paramgen_seed() يضبط seed لاستخدامه في التوليد بدلاً من استخدام قيمة مولدة عشوائيًا للبذرة. هذا مفيد لأغراض الاختبار فقط وقد يفشل إذا لم تُنتج البذرة أعدادًا أولية لكل من p و q في تكرارها الأول. يجب حفظ هذه القيمة إذا كان التحقق من صحة المفتاح p و q و g القابل للتحقق مطلوبًا، لأنها ليست جزءًا من مفتاح مستمر.

EVP_PKEY_CTX_set_dh_pad() يضبط وضع حشو DH. إذا كان pad هو 1، يُحشى السر المشترك بالأصفار حتى حجم العدد الأولي DH p. إذا كان pad صفرًا (المبدئي)، فلا يُجرى أي حشو.

EVP_PKEY_CTX_set_dh_nid() يضبط معاملات DH على القيم المطابقة لـ nid كما هو معرف في RFC7919 أو RFC3526. يجب أن يكون معامل nid إما NID_ffdhe2048، NID_ffdhe3072، NID_ffdhe4096، NID_ffdhe6144، NID_ffdhe8192، NID_modp_1536، NID_modp_2048، NID_modp_3072، NID_modp_4096، NID_modp_6144، NID_modp_8192 أو NID_undef لمسح القيمة المخزنة. يمكن استدعاء هذه الدالة أثناء توليد المعاملات أو المفاتيح. معامل nid ومعامل rfc5114 متنافيان.

EVP_PKEY_CTX_set_dh_rfc5114() و EVP_PKEY_CTX_set_dhx_rfc5114() كلاهما يضبط معاملات DH على القيم المعرفة في RFC5114. يجب أن يكون معامل rfc5114 إما 1 أو 2 أو 3 مطابقًا لأقسام RFC5114 2.1 و 2.2 و 2.3، أو 0 لمسح القيمة المخزنة. يمكن استدعاء هذه الكلية أثناء توليد المعاملات. يجب أن يكون ctx من نوع مفتاح EVP_PKEY_DHX. معامل rfc5114 ومعامل nid متنافيان.

  معاملات دالة اشتقاق المفتاح DH
لاحظ أن جميع الدوال التالية تتطلب أن يكون معامل ctx من نوع مفتاح خاص EVP_PKEY_DHX. عند استخدام اشتقاق المفتاح، يكون مخرج EVP_PKEY_derive() هو مخرج KDF بدلاً من السر المشترك DH. يُستخدم مخرج KDF عادةً كمفتاح تشفير المفاتيح (KEK) الذي بدوره يعمي مفتاح تشفير المحتوى (CEK).

EVP_PKEY_CTX_set_dh_kdf_type() يضبط نوع دالة اشتقاق المفتاح على kdf لاشتقاق مفتاح DH. القيم الممكنة هي EVP_PKEY_DH_KDF_NONE و EVP_PKEY_DH_KDF_X9_42 الذي يستخدم الاشتقاق المحدد في RFC2631 (استنادًا إلى خوارزمية التكييف الموصوفة في X9.42). عند استخدام اشتقاق المفتاح، يجب أيضًا تحديد معاملات kdf_oid و kdf_md و kdf_outlen.

EVP_PKEY_CTX_get_dh_kdf_type() يحصل على نوع دالة اشتقاق المفتاح لـ ctx المستخدمة لاشتقاق مفتاح DH. القيم الممكنة هي EVP_PKEY_DH_KDF_NONE و EVP_PKEY_DH_KDF_X9_42.

EVP_PKEY_CTX_set0_dh_kdf_oid() يضبط معرف كائن دالة اشتقاق المفتاح على oid لاشتقاق مفتاح DH. يجب أن يحدد هذا OID الخوارزمية المستخدمة مع مفتاح تشفير المحتوى. تأخذ المكتبة ملكية معرف الكائن لذا لا ينبغي للمستدعي تحرير الذاكرة الأصلية المشار إليها بواسطة oid.

EVP_PKEY_CTX_get0_dh_kdf_oid() يحصل على oid دالة اشتقاق المفتاح لـ ctx المستخدمة لاشتقاق مفتاح DH. المؤشر الناتج مملوك للمكتبة ولا ينبغي للمستدعي تحريره.

EVP_PKEY_CTX_set_dh_kdf_md() يضبط ملخص رسالة دالة اشتقاق المفتاح على md لاشتقاق مفتاح DH. لاحظ أن RFC2631 يحدد أن هذا الملخص يجب أن يكون SHA1 لكن OpenSSL يتسامح مع ملخصات أخرى.

EVP_PKEY_CTX_get_dh_kdf_md() يحصل على ملخص رسالة دالة اشتقاق المفتاح لـ ctx المستخدمة لاشتقاق مفتاح DH.

EVP_PKEY_CTX_set_dh_kdf_outlen() يضبط طول مخرج دالة اشتقاق المفتاح على len لاشتقاق مفتاح DH.

EVP_PKEY_CTX_get_dh_kdf_outlen() يحصل على طول مخرج دالة اشتقاق المفتاح لـ ctx المستخدمة لاشتقاق مفتاح DH.

EVP_PKEY_CTX_set0_dh_kdf_ukm() يضبط مادة مفتاح المستخدم على ukm وطولها على len لاشتقاق مفتاح DH. هذا المعامل اختياري ويطابق حقل partyAInfo في مصطلحات RFC2631. تتطلب المواصفات أن يكون طوله 512 بت لكن OpenSSL لا يفرض ذلك. تأخذ المكتبة ملكية مادة مفتاح المستخدم لذا لا ينبغي للمستدعي تحرير الذاكرة الأصلية المشار إليها بواسطة ukm.

EVP_PKEY_CTX_get0_dh_kdf_ukm() يحصل على مادة مفتاح المستخدم لـ ctx. قيمة الإرجاع هي طول مادة مفتاح المستخدم. المؤشر الناتج مملوك للمكتبة ولا ينبغي للمستدعي تحريره.

  معاملات EC
استخدم EVP_PKEY_CTX_set_group_name() (الموصوف أعلاه) لضبط اسم المنحنى على name لتوليد المعاملات والمفاتيح.

EVP_PKEY_CTX_set_ec_paramgen_curve_nid() يفعل نفس ما يفعله EVP_PKEY_CTX_set_group_name()، لكنه خاص بـ EC ويستخدم nid بدلاً من سلسلة محارف اسم.

لتوليد معاملات EC، يجب استدعاء إما EVP_PKEY_CTX_set_group_name() أو EVP_PKEY_CTX_set_ec_paramgen_curve_nid() وإلا يحدث خطأ لعدم وجود منحنى مبدئي. يمكن أيضًا استدعاء هذه الدوال لضبط المنحنى صراحةً عند توليد مفتاح EC.

EVP_PKEY_CTX_get_group_name() (الموصوف أعلاه) يمكن استخدامه للحصول على اسم المنحنى المُعيّن حاليًا مع ctx.

EVP_PKEY_CTX_set_ec_param_enc() يضبط ترميز معاملات EC على param_enc عند توليد معاملات EC أو مفتاح EC. يمكن أن يكون الترميز OPENSSL_EC_EXPLICIT_CURVE للمعاملات الصريحة (المبدئي في إصدارات OpenSSL قبل 1.1.0) أو OPENSSL_EC_NAMED_CURVE لاستخدام صيغة المنحنى المسمى. لتحقيق أقصى توافق، يجب استخدام صيغة المنحنى المسمى. ملاحظة: أُضيفت قيمة OPENSSL_EC_NAMED_CURVE في OpenSSL 1.1.0؛ يجب أن تستخدم الإصدارات السابقة 0 بدلاً من ذلك.

  معاملات ECDH
EVP_PKEY_CTX_set_ecdh_cofactor_mode() يضبط وضع المعامل المساعد على cofactor_mode لاشتقاق مفتاح ECDH. القيم الممكنة هي 1 لتمكين اشتقاق المفتاح بالمعامل المساعد، و0 لتعطيله، و-1 لمسح وضع المعامل المساعد المخزن والرجوع إلى وضع المعامل المساعد للمفتاح الخاص.

EVP_PKEY_CTX_get_ecdh_cofactor_mode() يُرجع وضع المعامل المساعد لـ ctx المستخدم لاشتقاق مفتاح ECDH. القيم الممكنة هي 1 عند تمكين اشتقاق المفتاح بالمعامل المساعد و0 خلاف ذلك.

  معاملات دالة اشتقاق مفتاح ECDH
EVP_PKEY_CTX_set_ecdh_kdf_type() يضبط نوع دالة اشتقاق المفتاح على kdf لاشتقاق مفتاح ECDH. القيم الممكنة هي EVP_PKEY_ECDH_KDF_NONE وEVP_PKEY_ECDH_KDF_X9_63 التي تستخدم اشتقاق المفتاح المحدد في X9.63. عند استخدام اشتقاق المفتاح، يجب أيضًا تحديد المعاملين kdf_md وkdf_outlen.

EVP_PKEY_CTX_get_ecdh_kdf_type() يُرجع نوع دالة اشتقاق المفتاح لـ ctx المستخدم لاشتقاق مفتاح ECDH. القيم الممكنة هي EVP_PKEY_ECDH_KDF_NONE وEVP_PKEY_ECDH_KDF_X9_63.

EVP_PKEY_CTX_set_ecdh_kdf_md() يضبط ملخص رسالة دالة اشتقاق المفتاح على md لاشتقاق مفتاح ECDH. لاحظ أن X9.63 يحدد أن هذا الملخص يجب أن يكون SHA1 لكن OpenSSL يتحمل ملخصات أخرى.

EVP_PKEY_CTX_get_ecdh_kdf_md() يحصل على ملخص رسالة دالة اشتقاق المفتاح لـ ctx المستخدم لاشتقاق مفتاح ECDH.

EVP_PKEY_CTX_set_ecdh_kdf_outlen() يضبط طول مخرج دالة اشتقاق المفتاح على len لاشتقاق مفتاح ECDH.

EVP_PKEY_CTX_get_ecdh_kdf_outlen() يحصل على طول مخرج دالة اشتقاق المفتاح لـ ctx المستخدم لاشتقاق مفتاح ECDH.

EVP_PKEY_CTX_set0_ecdh_kdf_ukm() يضبط مادة مفتاح المستخدم على ukm لاشتقاق مفتاح ECDH. هذا المعامل اختياري ويتوافق مع المعلومات المشتركة في مصطلحات X9.63. تأخذ المكتبة ملكية مادة مفتاح المستخدم لذا لا ينبغي للمستدعي تحرير الذاكرة الأصلية المشار إليها بواسطة ukm.

EVP_PKEY_CTX_get0_ecdh_kdf_ukm() يحصل على مادة مفتاح المستخدم لـ ctx. قيمة الإرجاع هي طول مادة مفتاح المستخدم. المؤشر الناتج مملوك للمكتبة ولا ينبغي تحريره بواسطة المستدعي.

  معاملات أخرى
EVP_PKEY_CTX_set1_id() وEVP_PKEY_CTX_get1_id() وEVP_PKEY_CTX_get1_id_len() تُستخدم للتلاعب بحقل المعرف الخاص لخوارزميات التوقيع المحددة مثل SM2. يضبط EVP_PKEY_CTX_set1_id() معرفًا مشارًا إليه بواسطة id بطول id_len للمكتبة. تأخذ المكتبة نسخة من المعرف بحيث يمكن للمستدعي تحرير الذاكرة الأصلية المشار إليها بواسطة id بأمان. يُرجع EVP_PKEY_CTX_get1_id_len() طول المعرف المضبوط عبر استدعاء سابق لـ EVP_PKEY_CTX_set1_id(). يُستخدم الطول عادةً لتخصيص ذاكرة كافية لاستدعاءات لاحقة لـ EVP_PKEY_CTX_get1_id(). يُرجع EVP_PKEY_CTX_get1_id() قيمة المعرف المضبوطة سابقًا للمستدعي في id. يجب على المستدعي تخصيص مساحة ذاكرة كافية لـ id قبل استدعاء EVP_PKEY_CTX_get1_id().

EVP_PKEY_CTX_set_kem_op() يضبط عملية KEM للتشغيل. يمكن ضبط هذا بعد EVP_PKEY_encapsulate_init() أو EVP_PKEY_decapsulate_init() لاختيار عملية kem. لأنواع المفاتيح التي تدعم التغليف وليس لها عملية مبدئية، مثل RSA، يجب استدعاء هذه الدالة قبل EVP_PKEY_encapsulate() أو EVP_PKEY_decapsulate().

المعاملات المدعومة للخوارزميات المضمنة موثقة في EVP_KEM-RSA(7) وEVP_KEM-EC(7) وEVP_KEM-X25519(7) وEVP_KEM-X448(7) وEVP_KEM-ML-KEM(7).

القيم المُرجعة
جميع الدوال الأخرى الموصوفة في هذه الصفحة تُرجع قيمة موجبة للنجاح و0 أو قيمة سالبة للفشل. على وجه الخصوص، تشير قيمة الإرجاع -2 إلى أن العملية غير مدعومة بواسطة خوارزمية المفتاح العام.

انظر أيضًا
EVP_PKEY_CTX_set_params(3) وEVP_PKEY_CTX_new(3) وEVP_PKEY_encrypt(3) وEVP_PKEY_decrypt(3) وEVP_PKEY_sign(3) وEVP_PKEY_verify(3) وEVP_PKEY_verify_recover(3) وEVP_PKEY_derive(3) وEVP_PKEY_keygen(3) وEVP_PKEY_encapsulate(3) وEVP_PKEY_decapsulate(3)

التاريخ
EVP_PKEY_CTX_get_rsa_oaep_md_name() وEVP_PKEY_CTX_get_rsa_mgf1_md_name() وEVP_PKEY_CTX_set_rsa_mgf1_md_name() وEVP_PKEY_CTX_set_rsa_oaep_md_name() وEVP_PKEY_CTX_set_dsa_paramgen_md_props() وEVP_PKEY_CTX_set_dsa_paramgen_gindex() وEVP_PKEY_CTX_set_dsa_paramgen_type() وEVP_PKEY_CTX_set_dsa_paramgen_seed() وEVP_PKEY_CTX_set_group_name() وEVP_PKEY_CTX_get_group_name() أُضيفت في OpenSSL 3.0.

وحدات الماكرو EVP_PKEY_CTX_set1_id() وEVP_PKEY_CTX_get1_id() وEVP_PKEY_CTX_get1_id_len() أُضيفت في 1.1.1، والدوال الأخرى أُضيفت في OpenSSL 1.0.0.

في OpenSSL 1.1.1 وما دونه كانت الدوال غالبًا وحدات ماكرو. من OpenSSL 3.0 أصبحت جميعها دوال.

EVP_PKEY_CTX_set_rsa_keygen_pubexp(), EVP_PKEY_CTX_get0_dh_kdf_ukm(), و EVP_PKEY_CTX_get0_ecdh_kdf_ukm() أُهملت في OpenSSL 3.0.

حقوق النسخ
حقوق النشر 2006-2025 لمؤلفي مشروع OpenSSL. جميع الحقوق محفوظة.

مرخص بموجب رخصة Apache 2.0 (المشار إليها فيما يلي بـ ”الرخصة“). لا يجوز لك استخدام هذا الملف إلا وفقًا لشروط الرخصة. يمكنك الحصول على نسخة منها في الملف LICENSE الموجود في حزمة التوزيع المصدرية أو على الرابط <https://www.openssl.org/source/license.html>.

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.