الاتّساق

من المهم أن يتصرف تطبيق Tink "بنفس الطريقة" في جميع لغات البرمجة. هذا المفهوم ليس مباشرًا، ولكنه الأهم:

للحفاظ على الاتّساق، يستخدم تطبيق Tink الاختبارات المتعدّدة اللغات التي يمكن العثور عليها في مستودع GitHub المتعدد اللغات. تُستخدَم هذه الاختبارات للتحقّق من اتّساق اللغات المختلفة وقابلية توافقها معها.

ومع ذلك، فإن تعريف الاتساق ليس مباشرًا كما يتوقعه المرء. وبالتالي، تقدّم هذه الصفحة تعريفًا للعمل لدينا. في الأساس، يوفر Tink نوعين من الاتساق:

السياق

بشكل عام، يوفر Tink واجهات برمجة التطبيقات التالية:

  • التلاعب بمجموعات المفاتيح: يوفّر تطبيق Tink واجهات برمجة تطبيقات لإضافة مفاتيح جديدة إلى مجموعة مفاتيح وإزالة مفاتيح من مجموعة مفاتيح وتغيير المفتاح الأساسي في مجموعة مفاتيح.

  • تسلسل مجموعة المفاتيح: يوفّر تطبيق Tink واجهات برمجة التطبيقات لإنشاء تسلسل لمجموعة مفاتيح على تسلسل من وحدات البايت، وتحليل مجموعة مفاتيح عكسيًا من تسلسل وحدات بايت.

  • إنشاء أولي: يوفر Tink واجهة برمجة تطبيقات لإنشاء واجهة لمجموعة أساسية من مجموعة مفاتيح. على سبيل المثال، لإنشاء كائن Aead من مجموعة مفاتيح في Java، يستدعي المستخدم keysetHandle.getPrimitive(Aead.class, config).

  • الاستخدام الأولي: توفر الواجهة التي يتم إنشاؤها في خطوة الإنشاء الأساسية واجهة برمجة تطبيقات لتنفيذ عمليات التشفير.

هناك سؤالان مهمان يجب طرحهما حول واجهات برمجة التطبيقات هذه:

  • الإنشاء: بالنسبة إلى مجموعة مفاتيح متسلسلة ولغة وبيانات أساسية، هل من الممكن إنشاء المجموعة الأساسية من مجموعة المفاتيح هذه باللغة؟

  • التقييم: إذا كان من الممكن إنشاء مجموعة أولية بلغة ما من مجموعة مفاتيح معيّنة، فكيف يعمل الكائن الأساسي؟

من المهم ملاحظة أن Tink لا يوفر الاتساق عند تحليل مجموعة المفاتيح. على سبيل المثال، من الممكن أن يستخدم Tink C++

  • نجح في تحليل مجموعات المفاتيح التي تحتوي على مفاتيح CHACHA20-POLY1305 على الرغم من عدم تنفيذ عمليات AEAD في Tink؛
  • تحليل مجموعات المفاتيح التي تحتوي على مفاتيح يبلغ طولها 1 بايت بنجاح، والتي ستفشل في جميع عمليات التشفير.

قد تتغير هذه السلوكيات في الإصدارات الثانوية.

اتساق التقييم

يعتبر اتّساق التقييم أهم من أي اتساق في عملية الإنشاء: إذا تعذّر على AEAD في لغة Java فك تشفير تشفير AEAD في لغة C++ ، يواجه المستخدمون مشكلة خطيرة.

بشكل عام، يهدف Tink إلى أن يكون متسقًا بالطريقة الواضحة بالنسبة إلى الأساسيات. على سبيل المثال، إذا قام برنامج ثنائي C++ بحساب توقيع باستخدام public_key_sign->Sign(data)، فمن المتوقع نجاح استدعاء التحقق المقابل من لغة Java (publicKeyVerify.verify(signature, data)).

ومع ذلك، حتى هنا هناك بعض المحاذير. على سبيل المثال، نوع الإرجاع aead.Encrypt في Java هو byte[]. وفقًا للفقرة 10.7 من مواصفات لغة Java (JLS)، يكون طول المصفوفة من النوع int والذي يمكن أن يصل إلى 2147483647 كحد أقصى وفقًا لـ §JLS 4.2.1. وبالتالي، يفشل تشفير صفيف بطول 2147483647 في Java: يحتوي التشفير على بعض النفقات العامة، ما يعني أن الناتج سيكون طويلاً جدًا. ومع ذلك، يسمح التشفير في اللغات الأخرى بنجاح هذه المدخلات.

وبالتالي، يوفر Tink اتساق التقييم: بالنسبة لمجموعة مفاتيح معينة، إذا نجح إنشاء المجموعة الأولية بلغتين، فستتصرف نفسها.

والاستثناء هو أن بعض العمليات قد تفشل في بعض الظروف الاستثنائية.

اتساق عملية الإنشاء

لا ينجح إنشاء المجموعات الأولية دائمًا لجميع مجموعات المفاتيح. على سبيل المثال، لا يسمح Tink للمستخدمين بإنشاء AesSivKey إذا كان طول المادة الأساسية 128 بت.

ومع ذلك، يوفر Tink الاتساق على النحو التالي: إذا كانت كلتا اللغتين تدعمان نوعًا رئيسيًا، تتزامن مجموعة المفاتيح التي يمكن إنشاء المجموعة الأساسية لها. وبالطبع، إذا كانت اللغة لا تدعم نوعًا رئيسيًا، فلا يمكن إنشاء أي عنصر أولي.

يعد اتساق الإنشاء أقل أهمية من اتساق التقييم، وهناك استثناءات لهذه القاعدة أكثر من اتساق التقييم. وقد تمّ توثيق هذه القيود في قائمة أنواع المفاتيح المتوافقة. على سبيل المثال، بالنسبة إلى نوع المفتاح ECIES Tink توفر اختيارًا للمنحنى الإهليلجي الذي سيتم استخدامه للاتفاق على المفتاح، لكن Java لا تدعم X25519. وبالتالي، فشل إنشاء مفتاح باستخدام X25519 في Java.


  1. في هذا المستند، نستخدم المصطلح Keyset للدلالة على الكائن الذي يسمى KeysetHandle في معظم اللغات.