टिंक वायर का फ़ॉर्मैट

इस पेज पर, कुंजी और प्रीमिटिव आउटपुट के लिए Tink के वायर फ़ॉर्मैट के बारे में जानकारी दी गई है. यह दस्तावेज़ उन क्रिप्टोग्राफ़र के लिए है जो ऐसी अन्य हाई-लेवल क्रिप्टो लाइब्रेरी के टिंक और मैनेजर के लिए अतिरिक्त भाषाएं जोड़ना चाहते हैं जिन्हें वायर के साथ काम करने वाला मोड चाहिए. यह आम दर्शकों के लिए नहीं बनाया गया है.

कीसेट सीरियलाइज़ेशन

Tink अपनी कीसेट को क्रम में लगाने के लिए, Google Protobuf का इस्तेमाल करता है.

  • बाइनरी सीरियल वाला कीसेट, सीरियलाइज़्ड कीसेट प्रोटो है. इसके बारे में tink.proto में बताया गया है. किसी कुंजी की KeyData वैल्यू प्रॉपर्टी, उससे जुड़े कुंजी टाइप का सीरियलाइज़्ड प्रोटो होती है.
  • JSON सीरियलाइज़्ड कीसेट, एक Keyset Proto है, जिसे JSON फ़ॉर्मैट में सीरियल के हिसाब से बनाया जाता है. ध्यान दें कि KeyData वैल्यू अब भी एक बाइनरी सीरियलाइज़्ड प्रोटो है.
  • एन्क्रिप्ट (सुरक्षित) किया गया कीसेट, सीरियल के हिसाब से बनाया गया EncryptedKeyst प्रोटो है. इसके बारे में tink.proto में बताया गया है. इसमें एन्क्रिप्ट (सुरक्षित) किया गया बाइनरी सीरियल वाला कीसेट है. साथ ही, इसमें एन्क्रिप्ट (सुरक्षित) नहीं किया गया कुछ KeysetInfo मेटाडेटा है.

टिंक आउटपुट प्रीफ़िक्स

ज़्यादातर टिंक प्रिमिटिव 5 बाइट वाले आउटपुट प्रीफ़िक्स के साथ काम करते हैं, जिनमें ये शामिल हैं:

  • 1 बाइट वाला वर्शन: 0x01
  • 4 बाइट की कुंजी का संकेत: यह इस्तेमाल किए गए पासकोड का की आईडी है.

कुछ लेगसी बटन, बाइट 0x00 वाले वर्शन के साथ भी काम कर सकते हैं.

ध्यान दें कि इस प्रीफ़िक्स की पुष्टि नहीं की गई है. साथ ही, सुरक्षा के लिए इस पर भरोसा नहीं किया जा सकता. Tink, डिक्रिप्शन या वेरिफ़िकेशन की प्रोसेस को तेज़ करने के लिए, इसका इस्तेमाल संकेत के तौर पर करता है.

एलईएडी

सामान्य तौर पर, Tink फ़ॉर्मैट AEAD साइफ़रटेक्स्ट को इस तरह से बनाता है:

prefix || IV || ciphertext || tag

जब तक कि आरएफ़सी में कुछ और न बताया गया हो. prefix खाली है या 5 बाइट टिंक आउटपुट प्रीफ़िक्स है.

एईएस-सीटीआर-एचएमएसी

AES-CTR-HMAC के लिए, Tink उससे जुड़े डेटा (AD) के साथ MAC की गणना इस तरह करता है:

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

जहां bitlen(AD), बिट में AD की लंबाई है, जिसे 64-बिट बिग-एंडियन अनसाइन्ड पूर्णांक के रूप में दिखाया जाता है. यह एचएमएसी स्कीम, Mcgrew से मिले AES-CBC-HMAC के ड्राफ़्ट का पालन करती है.

तय करने वाला AEAD

Tink में एईएस-एसआईवी के लिए आरएफ़सी 5297 लागू होता है. इसमें सिंथेटिक इनिशलाइज़ेशन वेक्टर (एसआईवी) को सादे टेक्स्ट की शुरुआत में रखा जाता है. प्रिमिटिव, 5 बाइट टिंक आउटपुट प्रीफ़िक्स जोड़ सकता है.

हालांकि, आरएफ़सी 5297 से जुड़े डेटा की सूची के साथ काम करता है, लेकिन Tink सिर्फ़ एक डेटा के साथ काम करता है, जो आरएफ़सी 5297 में किसी एक एलिमेंट वाली सूची से मेल खाता है. खाली संबद्ध डेटा एक खाली तत्व वाली सूची होती है, न कि कोई खाली सूची.

स्ट्रीमिंग AEAD

AES-सीटीआर एचएमएसी और AES-GCM-HKDF देखें.

एन्वेलप एन्क्रिप्शन

एन्वेलप एन्क्रिप्शन में, डेटा को एन्क्रिप्ट (सुरक्षित) करने वाली कुंजी DEK की मदद से, Tink के AEAD प्रिमिटिव का इस्तेमाल किया जाता है. एन्क्रिप्ट (सुरक्षित) करने का तरीका इस तरह काम करता है:

  • दिए गए कुंजी टेंप्लेट (या कुंजी पैरामीटर) का इस्तेमाल करके, एक नया 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 length 4 बाइट है, जो encrypted DEK की लंबाई को 32-बिट बिग-एंडियन पूर्णांक के तौर पर स्टोर करता है.

एमएसी

टिंक, इससे जुड़े आरएफ़सी का पालन करता है. प्रिमिटिव, टैग में 5 बाइट टिंक आउटपुट प्रीफ़िक्स जोड़ सकते हैं.

पीआरएफ़ सेट

टिंक, इससे जुड़े आरएफ़सी का पालन करता है. ध्यान दें कि पीआरएफ़ सेट के लिए कुंजी का टाइप, उसी एल्गोरिदम के MAC कुंजी टाइप से अलग है. इसमें आउटपुट की लंबाई शामिल नहीं है. PRF सेट बटन में कभी भी टिंक आउटपुट प्रीफ़िक्स नहीं जोड़ा जाता. इससे यह पक्का होता है कि आउटपुट असल में एक PRF है.

हाइब्रिड एन्क्रिप्शन

Tink हाइब्रिड एन्क्रिप्शन के लिए वायर का सामान्य फ़ॉर्मैट यह है:

prefix || encapsulated_key || encrypted_data

prefix खाली है या 5 बाइट टिंक आउटपुट प्रीफ़िक्स है. हर कुंजी टाइप में यह जानकारी होती है कि कितने बाइट पार्स करने हैं और उन बाइट को encapsulated_key से पार्स कैसे करना है.

HPKE (हाइब्रिड सार्वजनिक कुंजी एन्क्रिप्शन)

टिंक, आरएफ़सी 9180 में बताए गए एचपीकेई स्टैंडर्ड का पालन करता है. HPKE साइफ़रसुइट में ये तीन प्रिमिटिव होते हैं.

  • की एनकैप्सुलेशन मैकेनिज़्म (केईएम)
  • की डेरिवेशन फ़ंक्शन (केडीएफ़)
  • असोसिएट डेटा के साथ पुष्टि किया गया एन्क्रिप्शन (AEAD)

HPKE स्टैंडर्ड, आरएफ़सी 9180 के सेक्शन 10 में, वायर के सामान्य फ़ॉर्मैट के बारे में नहीं बताता. Tink के HPKE के लागू होने पर, encapsulated_key और encrypted_data की ये वैल्यू इस्तेमाल की जाती हैं.

  • encapsulated_key
    • भेजने वाले की सीरियल वाली सार्वजनिक कुंजी
    • आरएफ़सी 9180 के सेक्शन 4.1 में, enc के तौर पर बताया गया है
    • इस्तेमाल किए गए खास HPKE KEM के हिसाब से तय किया गया फ़ॉर्मैट
  • encrypted_data
    • साइफ़र टेक्स्ट और टैग (जैसे, ciphertext || tag बिना आईवी के)
    • आरएफ़सी 9180 के सेक्शन 4 में, ct के तौर पर बताया गया है
    • इस्तेमाल किए गए खास HPKE AEAD से तय किया गया फ़ॉर्मैट
X25519 डिफ़ी-हेलमैन वाला केईएम

X25519 DHKEM के लिए, enc वैल्यू, भेजने वाले की 32-बाइट वाली डिफ़ी-हेलमैन सार्वजनिक कुंजी है.

ECIES-AEAD-HKDF

Tink के ECIES-AEAD-HKDF लागू करने के लिए, encapsulated_key की एनकैप्सुलेशन मैकेनिज़्म (केईएम) का आउटपुट है और encrypted_data डेटा एनकैप्सुलेशन मैकेनिज़्म (डीईएम) का आउटपुट है.

केईएम

कुंजी के टाइप के आधार पर, Tink, आरएफ़सी 8422/ANSI.X9-62.2005 एन्कोडिंग स्टैंडर्ड के मुताबिक, कंप्रेस किए गए और बिना कंप्रेस किए इलिप्टिकल कर्व पॉइंट का इस्तेमाल करता है. कंप्रेस नहीं किए गए पॉइंट के लिए, 0x04 बाइट के बाद x और y कोऑर्डिनेट को तय साइज़ के पूर्णांक के तौर पर दिखाया जाता है. कंप्रेस किए गए निर्देशांक के लिए, बाइट 0x02 या 0x03 और x निर्देशांक का इस्तेमाल, तय साइज़ वाले पूर्णांक के तौर पर किया जाता है. X25519 के लिए, आरएफ़सी 7748 की परिभाषा का इस्तेमाल किया गया है (x कोऑर्डिनेट, तय साइज़ वाले पूर्णांक के तौर पर).

डेमोग्राफ़ी (DEM)

encrypted_data के लिए, Tink फ़ॉर्मैट में 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 आउटपुट है.

डिजिटल हस्ताक्षर

टिंक, इससे जुड़े आरएफ़सी का पालन करता है. प्रिमिटिव, जनरेट होने वाले टैग में 5 बाइट टिंक आउटपुट प्रीफ़िक्स जोड़ सकते हैं.

ECDSA

कुंजी के EcdsaSignatureEncrypt फ़ील्ड के हिसाब से, ईसीडीएसए हस्ताक्षर का फ़ॉर्मैट IEEE P1363 या ASN.1 DER होता है.

IEEE P1363 सिग्नेचर का फ़ॉर्मैट r || s है. इसमें r और s ज़ीरो-पैड किए गए हैं और इनका साइज़, कर्व के क्रम के बराबर बाइट है. उदाहरण के लिए, NIST P-256 कर्व के लिए, r और s 32 बाइट तक ज़ीरो-पैड किए गए हैं.

DER हस्ताक्षर को ASN.1 का इस्तेमाल करके एन्कोड किया गया है:

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

खास तौर पर, एन्कोडिंग:

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

Tink, हस्ताक्षर की पुष्टि करने के सबसे सही तरीकों का पालन करता है. इसके लिए, सिर्फ़ DER कोड में बदले गए ECDSA हस्ताक्षर स्वीकार किए जाते हैं. BER कोड में बदले गए दूसरे हस्ताक्षर अमान्य होते हैं.

इससे सिग्नेचर मैलवेयर हमलों को रोका जा सकता है. इनका असर अक्सर क्रिप्टो करंसी सिस्टम पर पड़ता है.