Tink তারের বিন্যাস

এই পৃষ্ঠাটি টিঙ্ক-এর কী (key) এবং প্রিমিটিভ আউটপুটের জন্য ব্যবহৃত ওয়্যার (wire) ফরম্যাট বর্ণনা করে। এই ডকুমেন্টেশনটি সেইসব ক্রিপ্টোগ্রাফারদের জন্য তৈরি, যারা টিঙ্ক-এ অতিরিক্ত ভাষা যোগ করতে চান এবং অন্যান্য উচ্চ-স্তরের ক্রিপ্টো লাইব্রেরির রক্ষণাবেক্ষণকারীদের জন্য, যারা একটি ওয়্যার-সামঞ্জস্যপূর্ণ মোড চান। এটি সাধারণ পাঠকদের জন্য নয়।

কীসেট সিরিয়ালাইজেশন

টিঙ্ক তার কীসেটগুলোকে সিরিয়ালাইজ করতে গুগল প্রোটোবাফ ব্যবহার করে।

  • একটি বাইনারি সিরিয়ালাইজড কীসেট হলো tink.proto- তে সংজ্ঞায়িত একটি সিরিয়ালাইজড কীসেট প্রোটো। কোনো কী-এর KeyData ভ্যালু প্রপার্টিটি হলো সংশ্লিষ্ট কী টাইপের একটি সিরিয়ালাইজড প্রোটো।
  • একটি JSON সিরিয়ালাইজড কীসেট হলো JSON ফরম্যাটে সিরিয়ালাইজ করা একটি কীসেট প্রোটো। উল্লেখ্য যে, KeyData ভ্যালুটি এখনও একটি বাইনারি সিরিয়ালাইজড প্রোটো।
  • একটি এনক্রিপ্টেড কীসেট হলো tink.proto- তে সংজ্ঞায়িত একটি সিরিয়ালাইজড EncryptedKeyset প্রোটো। এতে একটি এনক্রিপ্টেড বাইনারি সিরিয়ালাইজড কীসেট এবং ঐচ্ছিকভাবে কিছু আনএনক্রিপ্টেড KeysetInfo মেটাডেটা থাকে।

টিঙ্ক আউটপুট প্রিফিক্স

অধিকাংশ টিঙ্ক প্রিমিটিভ একটি ৫ বাইটের আউটপুট প্রিফিক্স সমর্থন করে, যা নিম্নলিখিত উপাদানগুলো নিয়ে গঠিত:

  • ১ বাইট সংস্করণ: 0x01
  • ৪ বাইটের কী ইঙ্গিত: এটি ব্যবহৃত কী-টির আইডি।

কিছু লিগ্যাসি কী ভার্সন বাইট 0x00 কেও সাপোর্ট করতে পারে।

মনে রাখবেন যে এই প্রিফিক্সটি প্রমাণীকৃত নয় এবং নিরাপত্তার জন্য এর উপর নির্ভর করা যায় না। টিঙ্ক ডিক্রিপশন বা ভেরিফিকেশনের গতি বাড়ানোর জন্য এটিকে একটি ইঙ্গিত হিসেবে ব্যবহার করে।

AEAD

সাধারণত, টিঙ্ক AEAD সাইফারটেক্সটগুলোকে নিম্নরূপে বিন্যস্ত করে:

prefix || IV || ciphertext || tag

সংশ্লিষ্ট RFC-তে অন্যভাবে নির্দিষ্ট করা না থাকলে, prefix হয় খালি অথবা একটি ৫ বাইটের টিঙ্ক আউটপুট প্রিফিক্স।

AES-CTR-HMAC

AES-CTR-HMAC এর ক্ষেত্রে, Tink নিম্নলিখিতভাবে সংশ্লিষ্ট ডেটা (AD) সহ MAC গণনা করে:

AD || IV || ciphertext || bitlen(AD)

যেখানে bitlen(AD) হলো AD-এর দৈর্ঘ্য, যা একটি ৬৪-বিট বিগ-এন্ডিয়ান আনসাইনড ইন্টিজার হিসেবে বিটে প্রকাশ করা হয়। এই HMAC স্কিমটি ম্যাকগ্রিউ-এর AES-CBC-HMAC খসড়া অনুসরণ করে।

ডিটারমিনিস্টিক AEAD

Tink, AES-SIV-এর জন্য RFC 5297 বাস্তবায়ন করে এবং সাইফারটেক্সটের শুরুতে সিন্থেটিক ইনিশিয়ালাইজেশন ভেক্টর (SIV) স্থাপন করে। এই প্রিমিটিভটি একটি ৫ বাইটের Tink আউটপুট প্রিফিক্স যোগ করতে পারে।

যদিও RFC 5297 অ্যাসোসিয়েটেড ডেটার একটি তালিকা সমর্থন করে, Tink শুধুমাত্র ঠিক একটি অ্যাসোসিয়েটেড ডেটা সমর্থন করে, যা RFC 5297-এর একটি উপাদানযুক্ত তালিকার অনুরূপ। একটি খালি অ্যাসোসিয়েটেড ডেটা হলো একটি খালি উপাদানযুক্ত তালিকা, এটি কোনো খালি তালিকা নয়।

স্ট্রিমিং AEAD

AES-CTR HMAC এবং AES-GCM-HKDF দেখুন।

খাম এনক্রিপশন

এনভেলপ এনক্রিপশন, টিঙ্ক-এর AEAD প্রিমিটিভ ব্যবহার করে DEK একটি ডেটা এনক্রিপশন কী-এর সাহায্যে ডেটা এনক্রিপ্ট করে। এনক্রিপশনটি নিম্নরূপে কাজ করে:

  • প্রদত্ত কী টেমপ্লেট (বা কী প্যারামিটার) ব্যবহার করে একটি নতুন DEK তৈরি করা হয়।
  • DEK একটি বাইট স্ট্রিং-এ সিরিয়ালাইজ করা হয়। সিরিয়ালাইজেশন ফরম্যাটটি হলো 'প্রোটো' কী টাইপের প্রোটোকল বাফার সিরিয়ালাইজেশন। উদাহরণস্বরূপ, এটি হলো AES GCM কী টাইপের DEK-এর জন্য aes_gcm.proto- তে সংজ্ঞায়িত একটি সিরিয়ালাইজড AesGcmKey প্রোটোকল বাফার মেসেজ। একটি প্রোটোকল বাফার কীভাবে সিরিয়ালাইজ করতে হয়, তা জানতে 'প্রোটোকল বাফার সিরিয়ালাইজেশন' দেখুন।
  • সিরিয়ালাইজড DEK একটি বাহ্যিক প্রদানকারী (যেমন, GCP) দ্বারা এনক্রিপ্ট করে একটি encrypted DEK এ রূপান্তরিত করা হয়।
  • DEK ব্যবহার করে প্লেইনটেক্সটকে তার সংশ্লিষ্ট ডেটাসহ এনক্রিপ্ট করে ciphertext পরিণত করা হয়। তাই ciphertext DEK এর সাথে সঙ্গতিপূর্ণ AEAD প্রিমিটিভের ফরম্যাটের হুবহু অনুরূপ।

এনভেলপ এনক্রিপশনের আউটপুট ফরম্যাটটি নিম্নরূপ:

encrypted DEK length || encrypted DEK || ciphertext

encrypted DEK encrypted DEK length ৪ বাইট, যা একটি ৩২-বিট বিগ-এন্ডিয়ান পূর্ণসংখ্যা হিসেবে সংরক্ষিত হয়।

ম্যাক

টিঙ্ক সংশ্লিষ্ট আরএফসিগুলো অনুসরণ করে। প্রিমিটিভগুলো ট্যাগে একটি ৫ বাইটের টিঙ্ক আউটপুট প্রিফিক্স যোগ করতে পারে।

পিআরএফ সেট

টিঙ্ক সংশ্লিষ্ট RFC-গুলো অনুসরণ করে। উল্লেখ্য যে, PRF Set-এর ক্ষেত্রে কী-টাইপটি একই অ্যালগরিদমের MAC কী-টাইপ থেকে ভিন্ন, কারণ এতে আউটপুট লেংথ অন্তর্ভুক্ত থাকে না। PRF Set কী-গুলো কখনোই একটি টিঙ্ক আউটপুট প্রিফিক্স যোগ করে না। এটি নিশ্চিত করে যে আউটপুটটি প্রকৃতপক্ষে একটি PRF।

হাইব্রিড এনক্রিপশন

টিঙ্ক হাইব্রিড এনক্রিপশনের সাধারণ ওয়্যার ফরম্যাটটি নিম্নরূপ:

prefix || encapsulated_key || encrypted_data

prefix হয় খালি অথবা একটি ৫ বাইটের টিঙ্ক আউটপুট প্রিফিক্স। প্রতিটি কী টাইপে এই তথ্য থাকে যে, কত বাইট পার্স করতে হবে এবং encapsulated_key থেকে সেই বাইটগুলো কীভাবে পার্স করতে হবে।

HPKE (হাইব্রিড পাবলিক কী এনক্রিপশন)

টিঙ্ক RFC 9180 -তে সংজ্ঞায়িত HPKE স্ট্যান্ডার্ড অনুসরণ করে। একটি HPKE সাইফারস্যুটে নিম্নলিখিত তিনটি প্রিমিটিভ অন্তর্ভুক্ত থাকে।

  • কী এনক্যাপসুলেশন মেকানিজম (KEM)
  • মূল ব্যুৎপত্তি ফাংশন (KDF)
  • সংশ্লিষ্ট ডেটা সহ প্রমাণীকৃত এনক্রিপশন (AEAD)

HPKE স্ট্যান্ডার্ড RFC 9180-এর সেকশন 10- এ কোনো সাধারণ ওয়্যার ফরম্যাট সংজ্ঞায়িত করে না। Tink-এর HPKE ইমপ্লিমেন্টেশন নিম্নলিখিত encapsulated_key এবং encrypted_data ভ্যালুগুলো ব্যবহার করে।

  • encapsulated_key
    • প্রেরকের ক্রমিক পাবলিক কী
    • RFC 9180-এর ৪.১ ধারায় enc হিসাবে সংজ্ঞায়িত।
    • ব্যবহৃত নির্দিষ্ট HPKE KEM দ্বারা নির্ধারিত ফরম্যাট
  • encrypted_data
    • সাইফারটেক্সট এবং ট্যাগ (অর্থাৎ, ciphertext || tag )
    • RFC 9180-এর ধারা ৪-ct হিসাবে সংজ্ঞায়িত।
    • ব্যবহৃত নির্দিষ্ট HPKE AEAD দ্বারা নির্ধারিত বিন্যাস
X25519 ডিফি-হেলম্যান-ভিত্তিক কেইএম

X25519 DHKEM-এর ক্ষেত্রে, enc মানটি হলো প্রেরকের ৩২-বাইট ডিফি-হেলম্যান পাবলিক কী।

ECIES-AEAD-HKDF

Tink-এর ECIES-AEAD-HKDF ইমপ্লিমেন্টেশনের ক্ষেত্রে, encapsulated_key হলো Key Encapsulation Mechanism (KEM)-এর আউটপুট এবং encrypted_data হলো Data Encapsulation Mechanism (DEM)-এর আউটপুট।

কেম

কী-টাইপের উপর নির্ভর করে, টিঙ্ক RFC 8422 / ANSI.X9-62.2005 এনকোডিং স্ট্যান্ডার্ড অনুসরণ করে কম্প্রেসড এবং আনকম্প্রেসড এলিপটিক কার্ভ পয়েন্ট ব্যবহার করে। আনকম্প্রেসড পয়েন্টের জন্য, 0x04 বাইটের পরে x এবং y স্থানাঙ্ক নির্দিষ্ট আকারের পূর্ণসংখ্যা হিসাবে থাকে। কম্প্রেসড স্থানাঙ্কের জন্য, 0x02 বা 0x03 বাইট এবং x স্থানাঙ্ক একটি নির্দিষ্ট আকারের পূর্ণসংখ্যা হিসাবে ব্যবহৃত হয়। X25519 এর জন্য, RFC 7748-এর সংজ্ঞাটি ব্যবহৃত হয় ( x স্থানাঙ্ক একটি নির্দিষ্ট আকারের পূর্ণসংখ্যা হিসাবে)।

ডিইএম

encrypted_data এর জন্য, টিঙ্ক AEAD-এর মতোই ফরম্যাট ব্যবহার করে। এর মধ্যে একটি IV নির্দিষ্ট করাও অন্তর্ভুক্ত।

মূল ব্যুৎপত্তি

প্রথমে শেয়ার করা পয়েন্টটির x স্থানাঙ্ক x_ss গণনা করা হয়। এরপর AEAD-এর জন্য কী-টি সেট করা হয়:

HKDF(ikm = encapsulated_key || x_ss, salt = salt_of_key, info = context_info, length = dem_key_size)

যেখানে encapsulated_key হলো বাইট আকারে সম্পূর্ণ KEM আউটপুট।

ডিজিটাল স্বাক্ষর

টিঙ্ক সংশ্লিষ্ট আরএফসিগুলো অনুসরণ করে। প্রিমিটিভগুলো জেনারেট করা ট্যাগে একটি ৫ বাইটের টিঙ্ক আউটপুট প্রিফিক্স যোগ করতে পারে।

ইসিডিএসএ

কী-তে থাকা EcdsaSignatureEncoding ফিল্ডের উপর নির্ভর করে, একটি ECDSA স্বাক্ষরের ফরম্যাট হয় IEEE P1363 অথবা ASN.1 DER

IEEE P1363 সিগনেচারের ফরম্যাট হলো r || s , যেখানে r এবং s শূন্য দিয়ে প্যাড করা হয় এবং বাইটে এদের সাইজ কার্ভের অর্ডারের সমান হয়। উদাহরণস্বরূপ, NIST P-256 কার্ভের জন্য, r এবং s শূন্য দিয়ে প্যাড করে ৩২ বাইট করা হয়।

DER স্বাক্ষরটি ASN.1 ব্যবহার করে এনকোড করা হয়:

ECDSA-Sig-Value :: = SEQUENCE { r INTEGER, s INTEGER }

বিশেষত, এনকোডিংটি হলো:

0x30 || totalLength || 0x02 || r's length || r || 0x02 || s's length || s

টিঙ্ক স্বাক্ষর যাচাইয়ের সর্বোত্তম পদ্ধতি অনুসরণ করে, এবং শুধুমাত্র DER এনকোডেড ECDSA স্বাক্ষর গ্রহণ করে (বিকল্প BER এনকোডেড স্বাক্ষর অবৈধ)।

এটি সিগনেচার ম্যালিয়েবিলিটি অ্যাটাক প্রতিরোধ করতে সাহায্য করে, যা প্রায়শই ক্রিপ্টোকারেন্সি সিস্টেমগুলোকে প্রভাবিত করে

বাহ্যিক Mu ML-DSA প্রিহ্যাশ মান

Prehash প্রিমিটিভ একটি মেসেজকে একটি প্রিহ্যাশ ভ্যালুতে পরিণত করে, যা SignPrehash প্রিমিটিভ দ্বারা স্বাক্ষরিত হয়। RFC 9881- এ বর্ণিত External Mu মোডে ML-DSA-এর জন্য, প্রিহ্যাশ ভ্যালুটি ৬৯ বাইটের হয় এবং এর লেআউটটি নিম্নরূপ:

0xff || key_id (4 bytes, big-endian) || mu (64 bytes)
  • mu হলো ML-DSA মেসেজ রিপ্রেজেন্টেটিভ, যা SHAKE256(tr || 0x00 || 0x00 || message, 64) দ্বারা গণনা করা হয়, যেখানে tr হলো পাবলিক কী-এর ৬৪-বাইট হ্যাশ, প্রথম 0x00 হলো বিশুদ্ধ ML-DSA-এর জন্য FIPS 204 ডোমেইন সেপারেটর, এবং দ্বিতীয় 0x00 হলো (খালি) কনটেক্সট স্ট্রিং-এর দৈর্ঘ্য। যেহেতু tr পাবলিক কী থেকে উদ্ভূত, mu ক্রিপ্টোগ্রাফিকভাবে সেই কী-এর সাথে আবদ্ধ থাকে — যদিও এই বন্ধনটি পরীক্ষা করার জন্য মূল মেসেজটির প্রয়োজন হয়।
  • ৫-বাইটের প্রিফিক্সটি হলো টিঙ্ক ফ্রেমিং, এটি mu এর অংশ নয়। এটি প্রিহ্যাশ ভ্যালুটিকে একটি নির্দিষ্ট কী-এর সাথে যুক্ত করে, যার ফলে সাইনপ্রিহ্যাশ (SignPrehash) জানতে পারে কোন কী দিয়ে সাইন করতে হবে এবং যে প্রিহ্যাশ ভ্যালুর জন্য কোনো কী নেই, তা বাতিল করে দিতে পারে। প্রিফিক্সটি সাধারণ মেটাডেটা এবং ক্রিপ্টোগ্রাফিকভাবে কোনো কিছুকে আবদ্ধ করে না: যে কেউ এটি রিরাইট করতে পারে।

সাইনিং এমন যেকোনো ইনপুট প্রত্যাখ্যান করে যা ঠিক ৬৯ বাইটের নয়, যা 0xff দিয়ে শুরু হয় না, অথবা যার কী আইডি তার কীসেটে থাকা কোনো সক্রিয় কী-এর সাথে মেলে না।