EVP_PKEY_VERIFY(3ssl)

الاسم
EVP_PKEY_verify_init, EVP_PKEY_verify_init_ex, EVP_PKEY_verify_init_ex2, EVP_PKEY_verify, EVP_PKEY_verify_message_init, EVP_PKEY_verify_message_update, EVP_PKEY_verify_message_final, EVP_PKEY_CTX_set_signature - التحقق من التوقيع باستخدام خوارزمية مفتاح عمومي

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

 int EVP_PKEY_verify_init(EVP_PKEY_CTX *ctx);
 int EVP_PKEY_verify_init_ex(EVP_PKEY_CTX *ctx, const OSSL_PARAM params[]);
 int EVP_PKEY_verify_init_ex2(EVP_PKEY_CTX *ctx, EVP_SIGNATURE *algo,
                              const OSSL_PARAM params[]);
 int EVP_PKEY_verify_message_init(EVP_PKEY_CTX *ctx, EVP_SIGNATURE *algo,
                                  const OSSL_PARAM params[]);
 int EVP_PKEY_CTX_set_signature(EVP_PKEY_CTX *pctx,
                                const unsigned char *sig, size_t siglen);
 int EVP_PKEY_verify_message_update(EVP_PKEY_CTX *ctx,
                                    unsigned char *in, size_t inlen);
 int EVP_PKEY_verify_message_final(EVP_PKEY_CTX *ctx);
 int EVP_PKEY_verify(EVP_PKEY_CTX *ctx,
                     const unsigned char *sig, size_t siglen,
                     const unsigned char *tbs, size_t tbslen);

الوصف
EVP_PKEY_verify_init() يُهيئ سياق خوارزمية مفتاح عمومي ctx للتحقق باستخدام الخوارزمية المُعطاة عند إنشاء السياق باستخدام EVP_PKEY_CTX_new(3) أو متغيراتها. تُستخدم الخوارزمية لجلب طريقة EVP_SIGNATURE ضمنيًا، انظر "الجلب الضمني" في provider(7) لمزيد من المعلومات حول الجلب الضمني.

EVP_PKEY_verify_init_ex() هو نفسه EVP_PKEY_verify_init() لكنه يضبط بالإضافة إلى ذلك المُعاملات المُمررة params على السياق قبل الإرجاع.

EVP_PKEY_verify_init_ex2() هو نفسه EVP_PKEY_verify_init_ex()، لكنه يعمل مع EVP_SIGNATURE algo مأخوذ بشكل صريح. لا يمكن استخدام سياق ctx بدون مفتاح مُحمّل مسبقًا مع هذه الدالة. اعتمادًا على الخوارزمية المأخوذة، قد تكون بعض التفاصيل المتعلقة بمعالجة المُدخل إلى EVP_PKEY_verify() محددة مسبقًا، وفي هذه الحالة، لا يمكن تغيير تلك التفاصيل عادةً. انظر "ملاحظات" أدناه لشرح أعمق.

EVP_PKEY_verify_message_init() يُهيئ سياق خوارزمية مفتاح عمومي ctx للتحقق من رسالة غير محدودة الحجم باستخدام الخوارزمية المُعطاة بواسطة algo والمفتاح المُعطى عبر EVP_PKEY_CTX_new(3) أو EVP_PKEY_CTX_new_from_pkey(3). يُدعم تمرير الرسالة بطريقة لمرة واحدة باستخدام EVP_PKEY_verify()، وعبر الجمع بين EVP_PKEY_verify_message_update() و EVP_PKEY_verify_message_final(). تُتيح هذه الدالة استخدام الخوارزميات التي يمكنها معالجة مُدخل بطول عشوائي، مثل ED25519 و RSA-SHA256 وما شابه.

EVP_PKEY_CTX_set_signature() يُحدد التوقيع sig بطول siglen بايت الذي يُتحقق منه بواسطة EVP_PKEY_verify_message_final(). يجب استخدامه مع EVP_PKEY_verify_message_update() و EVP_PKEY_verify_message_final(). انظر "ملاحظات" أدناه لشرح أعمق.

EVP_PKEY_verify_message_update() يُضيف inlen بايت من in إلى البيانات التي تُعالج للتحقق. تُحدد مواصفات وتنفيذ خوارزمية التوقيع كيفية معالجة بايتات المُدخل وما إذا كان هناك حد للحجم الكلي للمُدخل. انظر "ملاحظات" أدناه لشرح أعمق.

EVP_PKEY_verify_message_final() يتحقق من البيانات المُعالجة، معطى فقط ctx. يجب أن يكون التوقيع المُتحقق منه قد أُعطي مع EVP_PKEY_CTX_set_signature().

EVP_PKEY_verify() هي دالة لمرة واحدة تؤدي نفس الشيء كاستدعاء EVP_PKEY_CTX_set_signature() مع sig و siglen كمُعاملات، يليه استدعاء واحد EVP_PKEY_verify_message_update() مع tbs و tbslen، يليه استدعاء EVP_PKEY_verify_message_final().

ملاحظات

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

على سبيل المثال، يمكن توقع أن تطبيق RSA يتوقع فقط ملخصًا كمُدخل، بينما يمكن توقع أن ED25519 يعالج المُدخل بتجزئة، أي إنتاج الملخص داخليًا، وبينما يمكن توقع أن RSA-SHA256 يتعامل مع أي من وضعي التشغيل، اعتمادًا على ما إذا كانت العملية قد هُيئت باستخدام EVP_PKEY_verify_init_ex2() أو باستخدام EVP_PKEY_verify_message_init().

بالمثل، يتوقع تنفيذ RSA عادةً ضبط تفاصيل إضافية، مثل خوارزمية خلاصة الرسالة التي يُفترض معالجة الإدخال بها، بالإضافة إلى وضع الحشو (padding) (انظر EVP_PKEY_CTX_set_signature_md(3) و EVP_PKEY_CTX_set_rsa_padding(3) وغيرها من الوظائف المماثلة)، بينما يحتوي تنفيذ RSA-SHA256 عادةً على هذه التفاصيل محددة مسبقاً وغير قابلة للتغيير.

لا يمكن استخدام الدوال الموصوفة هنا لدمج خوارزميات منفصلة. على وجه الخصوص، لا يمكن استخدام EVP_PKEY_CTX_set_signature_md(3) ولا المُعامل OSSL_PARAM "digest" (OSSL_SIGNATURE_PARAM_DIGEST) لدمج خوارزمية توقيع مع خوارزمية تجزئة لمعالجة المُدخل. بعبارة أخرى، لا يمكن تحديد ctx مُحمّل مسبقًا بمفتاح RSA، أو algo جلب "RSA" ومحاولة تحديد SHA256 بشكل منفصل للحصول على وظيفة RSA-SHA256. إذا كان دمج الخوارزميات بهذه الطريقة مرغوبًا، يُرجى استخدام EVP_DigestVerifyInit(3) والدوال المرتبطة، أو EVP_VerifyInit(3) والدوال المرتبطة.

  إجراء عمليات تحقق متعددة
عند التهيئة باستخدام EVP_PKEY_verify_init_ex() أو EVP_PKEY_verify_init_ex2()، يمكن استدعاء EVP_PKEY_verify() أكثر من مرة على نفس السياق لإجراء عدة عمليات لمرة واحدة باستخدام نفس المُعاملات.

عند التهيئة باستخدام EVP_PKEY_verify_message_init()، لا يمكن استدعاء EVP_PKEY_verify() عدة مرات.

  حول EVP_PKEY_CTX_set_signature()
بعض خوارزميات التوقيع (مثل LMS) تتطلب تحديد بيانات التحقق من التوقيع قبل التحقق من الرسالة. تسمح خوارزميات أخرى بتحديد التوقيع متأخرًا. للسماح بأي من الطريقتين (والتي قد تعتمد على تدفق المُدخل للتطبيق)، يجب تحديد التوقيع المُتحقق منه باستخدام هذه الدالة عند استخدام EVP_PKEY_verify_message_update() و EVP_PKEY_verify_message_final() لإجراء التحقق.

القيم المُرجعة
ترجع جميع الدوال 1 عند النجاح و0 أو قيمة سالبة عند الفشل. ومع ذلك، على عكس الدوال الأخرى، تشير القيمة الراجعة 0 من EVP_PKEY_verify() وEVP_PKEY_verify_recover() وEVP_PKEY_verify_message_final() فقط إلى أن التوقيع لم يُتحقق بنجاح (أي أن tbs لم يطابق البيانات الأصلية أو أن التوقيع كان بشكل غير صحيح) وليست دلالة على خطأ أكثر خطورة.

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

أمثلة

  RSA مع حشوة PKCS#1 لـ SHA256
تحقق من التوقيع باستخدام حشو PKCS#1 ومستخلص SHA256 كمدخل:

 #include <openssl/evp.h>
 #include <openssl/rsa.h>

 EVP_PKEY_CTX *ctx;
 unsigned char *md, *sig;
 size_t mdlen, siglen;
 EVP_PKEY *verify_key;

 /*
  * NB: assumes verify_key, sig, siglen md and mdlen are already set up
  * and that verify_key is an RSA public key
  */
 ctx = EVP_PKEY_CTX_new(verify_key, NULL /* no engine */);
 if (ctx == NULL)
     /* Error occurred */
 if (EVP_PKEY_verify_init(ctx) <= 0)
     /* Error */
 if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) <= 0)
     /* Error */
 if (EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256()) <= 0)
     /* Error */

 /* Perform operation */
 ret = EVP_PKEY_verify(ctx, sig, siglen, md, mdlen);

 /*
  * ret == 1 indicates success, 0 verify failure and < 0 for some
  * other error.
  */

  RSA-SHA256 مع ملخص محسوب مسبقًا
تحقق من مستخلص باستخدام RSA-SHA256 باستخدام دوال اللقطة الواحدة. يُلاحظ أن RSA-SHA256 يُفترض أن يكون تنفيذًا لـ "sha256WithRSAEncryption"، حيث يكون الحشو محددًا مسبقًا كـ RSA_PKCS1_PADDING، ويُفترض أن المستخلص المدخل قد حُسب باستخدام SHA256.

 #include <openssl/evp.h>
 #include <openssl/rsa.h>

 EVP_PKEY_CTX *ctx;
 /* md is a SHA-256 digest in this example. */
 unsigned char *md, *sig;
 size_t mdlen = 32, siglen;
 EVP_PKEY *signing_key;

 /*
  * NB: assumes verify_key, sig, siglen, md and mdlen are already set up
  * and that verify_key is an RSA public key
  */
 ctx = EVP_PKEY_CTX_new(signing_key, NULL /* no engine */);
 alg = EVP_SIGNATURE_fetch(NULL, "RSA-SHA256", NULL);

 if (ctx == NULL)
     /* Error occurred */
 if (EVP_PKEY_verify_init_ex2(ctx, alg, NULL) <= 0)
     /* Error */

 /* Determine buffer length */
 if (EVP_PKEY_verify(ctx, sig, siglen, md, mdlen) <= 0)
     /* Error or signature doesn't verify */

 /* Perform operation */
 ret = EVP_PKEY_verify(ctx, sig, siglen, md, mdlen);

 /*
  * ret == 1 indicates success, 0 verify failure and < 0 for some
  * other error.
  */

  RSA-SHA256، طلقة واحدة
تحقق من مستند باستخدام RSA-SHA256 باستخدام دوال اللقطة الواحدة. يُلاحظ أن RSA-SHA256 يُفترض أن يكون تنفيذًا لـ "sha256WithRSAEncryption"، حيث يكون الحشو محددًا مسبقًا كـ RSA_PKCS1_PADDING.

 #include <openssl/evp.h>
 #include <openssl/rsa.h>

 EVP_PKEY_CTX *ctx;
 /* in the input in this example. */
 unsigned char *in, *sig;
 /* inlen is the length of the input in this example. */
 size_t inlen, siglen;
 EVP_PKEY *signing_key;
 EVP_SIGNATURE *alg;

 /*
  * NB: assumes signing_key, in and inlen are set up before
  * the next step. signing_key must be an RSA private key,
  * in must point to data to be digested and signed, and
  * inlen must be the size of the data in bytes.
  */
 ctx = EVP_PKEY_CTX_new(signing_key, NULL /* no engine */);
 alg = EVP_SIGNATURE_fetch(NULL, "RSA-SHA256", NULL);

 if (ctx == NULL || alg == NULL)
     /* Error occurred */
 if (EVP_PKEY_verify_message_init(ctx, alg, NULL) <= 0)
     /* Error */

 /* Perform operation */
 ret = EVP_PKEY_verify(ctx, sig, siglen, in, inlen);

 /*
  * ret == 1 indicates success, 0 verify failure and < 0 for some
  * other error.
  */

  RSA-SHA256، باستخدام التحديث والنهاية
هذا مماثل للمثال السابق، لكن مع السماح بوظيفية شبيهة بالدفق.

 #include <openssl/evp.h>
 #include <openssl/rsa.h>

 EVP_PKEY_CTX *ctx;
 /* in is the input in this example. */
 unsigned char *in, *sig;
 /* inlen is the length of the input in this example. */
 size_t inlen, siglen;
 EVP_PKEY *signing_key;
 EVP_SIGNATURE *alg;

 /*
  * NB: assumes signing_key, in and inlen are set up before
  * the next step. signing_key must be an RSA private key,
  * in must point to data to be digested and signed, and
  * inlen must be the size of the data in bytes.
  */
 ctx = EVP_PKEY_CTX_new(signing_key, NULL /* no engine */);
 alg = EVP_SIGNATURE_fetch(NULL, "RSA-SHA256", NULL);

 if (ctx == NULL || alg == NULL)
     /* Error occurred */
 if (EVP_PKEY_verify_message_init(ctx, alg, NULL) <= 0)
     /* Error */

 /* We have the signature, specify it early */
 EVP_PKEY_CTX_set_signature(ctx, sig, siglen);

 /* Perform operation */
 while (inlen > 0) {
     if (EVP_PKEY_verify_message_update(ctx, in, inlen)) <= 0)
         /* Error */
     if (inlen > 256) {
         inlen -= 256;
         in += 256;
     } else {
         inlen = 0;
     }
 }
 ret = EVP_PKEY_verify_message_final(ctx);

 /*
  * ret == 1 indicates success, 0 verify failure and < 0 for some
  * other error.
  */

انظر أيضًا
EVP_PKEY_CTX_new(3), EVP_PKEY_encrypt(3), EVP_PKEY_decrypt(3), EVP_PKEY_sign(3), EVP_PKEY_verify_recover(3), EVP_PKEY_derive(3)

التاريخ
أُضيفت الدالتان EVP_PKEY_verify_init() و EVP_PKEY_verify() في OpenSSL 1.0.0.

الدالة EVP_PKEY_verify_init_ex() أُضيفت في OpenSSL 3.0.

الدوال EVP_PKEY_verify_init_ex2() و EVP_PKEY_verify_message_init() و EVP_PKEY_verify_message_update() و EVP_PKEY_verify_message_final() و EVP_PKEY_CTX_set_signature() أُضيفت في OpenSSL 3.4.

حقوق النسخ
حقوق النشر 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.