ধারাবাহিকতা

সব প্রোগ্রামিং ল্যাঙ্গুয়েজে Tink যাতে "একই রকম" আচরণ করে তা গুরুত্বপূর্ণ। এই ধারণাটি সহজ নয়, তবে সবচেয়ে গুরুত্বপূর্ণ হল:

ধারাবাহিকতা বজায় রাখতে, Tink ক্রস-ল্যাঙ্গুয়েজ টেস্ট ব্যবহার করে যা ক্রস-ল্যাঙ্গুয়েজ GitHub রিপোজিটরি-তে পাওয়া যাবে। এইসব পরীক্ষা বিভিন্ন ভাষার ধারাবাহিকতা ও ইন্টারঅপারেবিলিটি যাচাই করে।

তবে, ধারাবাহিকতা নির্ধারণ করা যতটা সহজ মনে হয়, ততটা সহজ নয়। তাই, এই পৃষ্ঠায় আমাদের কাজের সংজ্ঞা দেওয়া হয়েছে। মূলত, Tink দুই ধরনের কনসিস্টেন্সি প্রদান করে:

প্রসঙ্গ

উচ্চ স্তরে, Tink নিম্নলিখিত API প্রদান করে:

  • কীসেট ম্যানিপুলেশন: Tink, কীসেটে নতুন কী যোগ করা, কীসেট থেকে কী সরানো এবং কীসেটে প্রাথমিক কী পরিবর্তন করার জন্য API প্রদান করে।

  • কীসেট সিরিয়ালাইজেশন: Tink, বাইটের সিকোয়েন্সে কীসেট সিরিয়ালাইজ করতে এবং বাইটের সিকোয়েন্স থেকে কীসেট পার্স করতে API প্রদান করে।

  • প্রিমিটিভ তৈরি করা: Tink, কীসেট থেকে প্রিমিটিভের জন্য ইন্টারফেস তৈরি করতে একটি API প্রদান করে। যেমন, Java-তে কীসেট থেকে Aead অবজেক্ট তৈরি করতে, ব্যবহারকারী keysetHandle.getPrimitive(config, Aead.class) কল করেন।

  • প্রিমিটিভ ব্যবহার: প্রিমিটিভ তৈরির ধাপে তৈরি করা ইন্টারফেস ক্রিপ্টোগ্রাফিক অপারেশন করার জন্য একটি API প্রদান করে।

এইসব API সম্পর্কে দুটি গুরুত্বপূর্ণ প্রশ্ন জিজ্ঞাসা করতে হবে:

  • তৈরি করা: সিরিয়ালাইজ করা নির্দিষ্ট কীসেট, ভাষা ও প্রিমিটিভের জন্য, এই কীসেট থেকে এই ভাষায় প্রিমিটিভ তৈরি করা কি সম্ভব?

  • মূল্যায়ন: প্রদত্ত কীসেট থেকে কোনও ভাষায় প্রিমিটিভ তৈরি করা গেলে, প্রিমিটিভ অবজেক্ট কীভাবে কাজ করে?

মনে রাখবেন, Tink কোনও কীসেট পার্স করার সময় ধারাবাহিকতা বজায় রাখে না। যেমন, Tink C++-এর পক্ষে এটি সম্ভব যে

  • CHACHA20-POLY1305 কী সহ কীসেট সফলভাবে পার্স করে, যদিও CHACHA20-POLY1305 AEAD অপারেশন Tink-এ প্রয়োগ করা হয় না;
  • ১-বাইট দৈর্ঘ্যের কী সহ কীসেট সফলভাবে পার্স করে, যা সব ক্রিপ্টোগ্রাফিক অপারেশনে ব্যর্থ হবে।

মাইনর ভার্সনে এই আচরণ পরিবর্তিত হতে পারে।

মূল্যায়নের ধারাবাহিকতা

মূল্যায়নের ধারাবাহিকতা, তৈরি করার প্রসেসের ধারাবাহিকতার চেয়ে বেশি গুরুত্বপূর্ণ: Java-তে AEAD যদি C++-এ AEAD-এর এনক্রিপশন ডিক্রিপ্ট করতে না পারে, তাহলে ব্যবহারকারীদের গুরুতর সমস্যা হবে।

সাধারণত, Tink-এর লক্ষ্য হল প্রিমিটিভের জন্য স্পষ্ট উপায়ে সামঞ্জস্যপূর্ণ হওয়া। যেমন, C++ বাইনারি public_key_sign->Sign(data)-এর মাধ্যমে কোনও স্বাক্ষর কম্পিউট করলে, সংশ্লিষ্ট জাভা যাচাইকরণ কল publicKeyVerify.verify(signature, data) সফল হবে বলে আশা করা হয়।

তবে, এখানেও কিছু সতর্কতা রয়েছে। যেমন, Java-তে aead.Encrypt-এর রিটার্ন টাইপ হল byte[]। Java Language Specification (JLS) §10.7 অনুযায়ী, অ্যারের দৈর্ঘ্য int ধরনের হয় যা §JLS 4.2.1 অনুযায়ী সর্বাধিক 2147483647 হতে পারে। তাই, Java-তে ২১৪৭৪৮৩৬৪৭ দৈর্ঘ্যের অ্যারে এনক্রিপ্ট করা যায় না: এনক্রিপশনের কিছু ওভারহেড থাকে, যার অর্থ আউটপুট খুব দীর্ঘ হবে। তবে, অন্যান্য ভাষায় এই ধরনের ইনপুটের ক্ষেত্রে এনক্রিপশন সফল হতে পারে।

তাই, Tink মূল্যায়নের ধারাবাহিকতা প্রদান করে: প্রদত্ত কীসেটের জন্য, যদি দুটি ভাষায় প্রিমিটিভ তৈরি করা সফল হয়, তাহলে তারা একই আচরণ করে।

ব্যতিক্রম হল, কিছু ব্যতিক্রমী পরিস্থিতিতে কিছু অপারেশন ব্যর্থ হতে পারে।

ক্রিয়েশন কনসিসটেন্সি

সব কীসেটের জন্য প্রিমিটিভ তৈরি করা সবসময় সফল হয় না। যেমন, কী মেটেরিয়ালের দৈর্ঘ্য ১২৮ বিট হলে, Tink ব্যবহারকারীদের AesSivKey তৈরি করতে দেয় না।

তবুও, Tink নিম্নলিখিতভাবে সামঞ্জস্য প্রদান করে: যদি দুটি ভাষা একটি কী টাইপকে সমর্থন করে, তাহলে যে কীগুলির সেটের জন্য প্রিমিটিভ তৈরি করা যেতে পারে তা একই হয়। অবশ্যই, কোনও ভাষা যদি কোনও কী টাইপকে সাপোর্ট না করে, তাহলে কোনও প্রিমিটিভ অবজেক্ট তৈরি করা যাবে না।

মূল্যায়নের ধারাবাহিকতার চেয়ে তৈরির ধারাবাহিকতা কম গুরুত্বপূর্ণ এবং মূল্যায়নের ধারাবাহিকতার চেয়ে এই নিয়মের ক্ষেত্রে আরও বেশি ব্যতিক্রম আছে। এইসব সীমাবদ্ধতা আমাদের কাজ করে এমন 'কী'-এর ধরনের তালিকাতে উল্লেখ করা আছে। যেমন, 'কী' টাইপ ECIES-এর জন্য Tink, 'কী' এগ্রিমেন্টের জন্য কোন উপবৃত্তাকার বক্ররেখা ব্যবহার করতে হবে তার একটি বিকল্প অফার করে, কিন্তু Java, X25519-কে সমর্থন করে না। তাই, Java-তে X25519 ব্যবহার করে কী তৈরি করা যায় না।


  1. এই ডকুমেন্টে, আমরা Keyset শব্দটি ব্যবহার করি যা বেশিরভাগ ভাষায় KeysetHandle নামে পরিচিত। ↩