EVP_DIGESTSIGNINIT(3SSL)

الاسم
EVP_DigestSignInit_ex, EVP_DigestSignInit, EVP_DigestSignUpdate, EVP_DigestSignFinal, EVP_DigestSign - دوال التوقيع EVP

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

 int EVP_DigestSignInit_ex(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
                           const char *mdname, OSSL_LIB_CTX *libctx,
                           const char *props, EVP_PKEY *pkey,
                           const OSSL_PARAM params[]);
 int EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
                        const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey);
 int EVP_DigestSignUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt);
 int EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sig, size_t *siglen);

 int EVP_DigestSign(EVP_MD_CTX *ctx, unsigned char *sig,
                    size_t *siglen, const unsigned char *tbs,
                    size_t tbslen);

الوصف
إجراءات التوقيع EVP هي واجهة عالية المستوى للتوقيعات الرقمية. تُهضم بيانات الإدخال أولاً قبل أن يحدث التوقيع.

EVP_DigestSignInit_ex() تُعدّ سياق التوقيع ctx لاستخدام هضم باسم mdname ومفتاح خاص pkey. يُمرّر اسم الهضم المراد استخدامه إلى مزود خوارزمية التوقيع المستخدمة. كيفية تفسير ذلك المزود لاسم الهضم خاصة بالمزود. قد ينفذ المزود ذلك الهضم مباشرة بنفسه أو قد يختار (اختيارياً) جلبه (مما قد يؤدي إلى اختيار هضم من مزود مختلف). إذا دعم المزود جلب الهضم، فقد يستخدم وسيط props للخصائص التي ستُستخدم أثناء الجلب. أخيراً، تُضبط المعاملات الممررة params، إذا لم تكن NULL، على السياق قبل الإرجاع.

تُستخدم خوارزمية pkey لجلب طريقة EVP_SIGNATURE ضمنيًا، لاستخدامها في التوقيع الفعلي. انظر "Implicit fetch" في provider(7) لمزيد من المعلومات حول عمليات الجلب الضمني.

تدعم مزودات OpenSSL المبدئية والقديمة جلب الخلاصات ويمكنها جلب هذه الخلاصات من أي مزود متاح. يدعم مزود OpenSSL FIPS أيضًا جلب الخلاصات ولكنه سيجلب فقط الخلاصات التي نُفذت هي نفسها داخل مزود FIPS.

يجب إنشاء ctx باستخدام EVP_MD_CTX_new() قبل استدعاء هذه الدالة. إذا لم يكن pctx NULL، فسيُكتب EVP_PKEY_CTX لعملية التوقيع إلى *pctx: يمكن استخدام هذا لضبط خيارات توقيع بديلة. لاحظ أن أي قيمة موجودة في *pctx تُستبدل. يجب ألا تُحرّر قيمة EVP_PKEY_CTX المُرجعة مباشرة بواسطة التطبيق إذا لم يُسند إلى ctx قيمة EVP_PKEY_CTX قبل تمريره إلى EVP_DigestSignInit_ex() (مما يعني أن EVP_PKEY_CTX يُنشأ داخل EVP_DigestSignInit_ex() وسيُحرّر آلياً عند تحرير EVP_MD_CTX). إذا أُنشئ EVP_PKEY_CTX المراد استخدامه بواسطة EVP_DigestSignInit_ex، فسيستخدم OSSL_LIB_CTX المحدد في libctx وسلسلة استعلام الخصائص المحددة في props.

قد يكون الهضم mdname NULL إذا دعمته خوارزمية التوقيع. يمكن أن تكون وسيطة props NULL دائماً.

لن يُنشأ أي EVP_PKEY_CTX بواسطة EVP_DigestSignInit_ex() إذا كان ctx الممرر قد أُسند إليه واحد بالفعل عبر EVP_MD_CTX_set_pkey_ctx(3). انظر أيضاً SM2(7).

يمكن استخدام أنواع EVP_PKEY التي تدعم التوقيع فقط مع هذه الدوال. يشمل ذلك خوارزميات MAC حيث يُعتبر توليد MAC شكلاً من "التوقيع". أنواع EVP_PKEY المضمنة التي تدعمها هذه الدوال هي CMAC وPoly1305 وDSA وECDSA وHMAC وRSA وSipHash وEd25519 وEd448.

لا يمكن استخدام جميع خلاصات الرسائل لجميع أنواع المفاتيح. تنطبق التوليفات التالية.

DSA يدعم SHA1 و SHA224 و SHA256 و SHA384 و SHA512

ECDSA
    يدعم SHA1 و SHA224 و SHA256 و SHA384 و SHA512 و SM3

RSA بدون حشوة
    لا يدعم أي هضم (يجب أن يكون الهضم type NULL)

RSA مع حشوة X931
    يدعم SHA1 و SHA256 و SHA384 و SHA512

جميع أنواع حشو RSA الأخرى
    دعم SHA1 و SHA224 و SHA256 و SHA384 و SHA512 و MD5 و MD5_SHA1 و MD2 و MD4 و MDC2 و SHA3-224 و SHA3-256 و SHA3-384 و SHA3-512

Ed25519 و Ed448
    لا تدعم أي هضم (يجب أن يكون الهضم type NULL)

HMAC
    يدعم أي خلاصة (digest)

CMAC وPoly1305 وSipHash
    سيتجاهل أي ملخص (digest) مقدم.

إذا استُخدم RSA-PSS وسرت قيود، فيجب أن يتطابق الملخص.

تعمل EVP_DigestSignInit() بنفس طريقة EVP_DigestSignInit_ex() باستثناء أن معامل mdname سيُستنتج من الهضم المزود type، وستكون props NULL. حيثما وُجد، سيُستخدم ENGINE e لتنفيذات خوارزمية التوقيع والهضم. قد يكون e NULL.

EVP_DigestSignUpdate() تُجزئ cnt بايت من البيانات عند d في سياق التوقيع ctx. يمكن استدعاء هذه الدالة عدة مرات على نفس ctx لتضمين بيانات إضافية. ctx يجب ألا يكون NULL.

ما لم يكن sig NULL، تُوقع EVP_DigestSignFinal() البيانات في ctx وتضع التوقيع في sig. وإلا، يُكتب الحجم الأقصى الضروري للمخزن المؤقت للإخراج في معامل siglen. إذا لم يكن sig NULL، فيجب قبل الاستدعاء أن يحتوي معامل siglen على طول المخزن المؤقت sig. إذا نجح الاستدعاء، يُكتب التوقيع إلى sig وتُكتب كمية البيانات إلى siglen.

EVP_DigestSign() مشابهة لاستدعاء واحد لـ EVP_DigestSignUpdate() وEVP_DigestSignFinal(). ما لم يكن sig NULL، تُوقع EVP_DigestSign() البيانات tbs بطول tbslen بايت وتضع التوقيع في مخزن مؤقت sig بحجم siglen. إذا كان sig NULL، يُكتب الحجم الأقصى الضروري للمخزن المؤقت للتوقيع في معامل siglen.

القيم المُرجعة
تُرجع EVP_DigestSignInit() وEVP_DigestSignUpdate() وEVP_DigestSignFinal() وEVP_DigestSign() 1 للنجاح و0 للفشل.

يمكن الحصول على رموز الخطأ من ERR_get_error(3).

ملاحظات
ينبغي دائمًا استخدام واجهة EVP للتواقيع الرقمية بدلاً من الواجهات منخفضة المستوى. هذا لأن الكود يصبح حينها شفافًا للخوارزمية المستخدمة وأكثر مرونة بكثير.

EVP_DigestSign() هي عملية لمرة واحدة تُوقع كتلة واحدة من البيانات في دالة واحدة. بالنسبة للخوارزميات التي تدعم التدفق، فهي مكافئة لاستدعاء EVP_DigestSignUpdate() وEVP_DigestSignFinal(). بالنسبة للخوارزميات التي لا تدعم التدفق (مثل PureEdDSA)، فهي الطريقة الوحيدة لتوقيع البيانات.

في الإصدارات السابقة من OpenSSL، كان هناك ارتباط بين أنواع ملخصات الرسائل (message digest) وخوارزميات المفتاح العام. وهذا يعني أن ملخصات "الاستنساخ" مثل EVP_dss1() كانت مطلوبة للتوقيع باستخدام SHA1 و DSA. لم يعد هذا ضرورياً ويُنصح الآن بعدم استخدام ملخصات الاستنساخ.

لبعض أنواع المفاتيح والمعلمات، يجب بذر مولد الأرقام العشوائية. إذا فشل البذر الآلي أو إعادة البذر لـ OpenSSL CSPRNG بسبب ظروف خارجية (راجع RAND(7))، فستفشل العملية.

استدعاء EVP_DigestSignFinal() يُنهي داخلياً نسخة من سياق الهضم. هذا يعني أنه يمكن استدعاء EVP_DigestSignUpdate() وEVP_DigestSignFinal() لاحقاً لهضم وتوقيع بيانات إضافية. قد تعطل التطبيقات هذا السلوك بضبط علم سياق EVP_MD_CTX_FLAG_FINALISE عبر EVP_MD_CTX_set_flags(3).

لاحظ أن ليس كل المزوّدين يدعمون الاستمرار، ففي حال عدم سماح المزوّد المختار بتكرار السياقات، ستنهي EVP_DigestSignFinal() سياق التلخيص وستؤدي محاولة معالجة بيانات إضافية عبر EVP_DigestSignUpdate() إلى خطأ.

يمكن استدعاء دالتي EVP_DigestSignInit() و EVP_DigestSignInit_ex() مرات متعددة على سياق، ويجب حفظ المعاملات المحددة من الاستدعاءات السابقة إذا كان معامل pkey فارغًا. يعيد الاستدعاء عندئذٍ ضبط حالة ctx فقط.

لا يمكن استدعاء EVP_DigestSign() مرة أخرى بمجرد إنشاء توقيع (بتمرير sig كقيمة غير فارغة)، إلا إذا أُعيدت تهيئة EVP_MD_CTX باستدعاء EVP_DigestSignInit_ex().

قد يؤدي تجاهل إرجاعات الفشل لدالتي EVP_DigestSignInit() و EVP_DigestSignInit_ex() إلى سلوك غير محدد لاحقًا عند استدعاء EVP_DigestSignUpdate() أو EVP_DigestSignFinal() أو EVP_DigestSign().

يُثبط استخدام EVP_PKEY_get_size() مع هذه الدوال لأن بعض عمليات التوقيع قد يكون لها طول توقيع يعتمد على المعاملات المحددة. ونتيجة لذلك، يجب أن تُرجع EVP_PKEY_get_size() قيمة تشير إلى أقصى توقيع ممكن لأي مجموعة من المعاملات.

انظر أيضًا
EVP_DigestVerifyInit(3)، EVP_DigestInit(3)، evp(7)، HMAC(3)، MD2(3)، MD5(3)، MDC2(3)، RIPEMD160(3)، SHA1(3)، openssl-dgst(1)، RAND(7)

التاريخ
أُضيفت EVP_DigestSignInit() و EVP_DigestSignUpdate() و EVP_DigestSignFinal() في OpenSSL 1.0.0.

أُضيفت EVP_DigestSignInit_ex() في OpenSSL 3.0.

حُوّلت EVP_DigestSignUpdate() من ماكرو إلى دالة في OpenSSL 3.0.

حقوق النسخ
حقوق النشر 2006-2024 لمؤلفي مشروع 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.