लगातार वीडियो अपलोड करना

यह ज़रूरी है कि Tink सभी प्रोग्रामिंग लैंग्वेज में "एक जैसा" काम करे. यह कॉन्सेप्ट आसान नहीं है, लेकिन सबसे ज़रूरी बात यह है कि:

एक जैसा अनुभव देने के लिए, Tink क्रॉस-लैंग्वेज टेस्ट का इस्तेमाल करता है. ये टेस्ट, क्रॉस-लैंग्वेज GitHub रिपॉज़िटरी में मिल सकते हैं. इन टेस्ट से, अलग-अलग भाषाओं के बीच एक जैसा होने और इंटरऑपरेबिलिटी की पुष्टि की जाती है.

हालांकि, कंसिस्टेंसी को तय करना उतना आसान नहीं है जितना लगता है. इसलिए, इस पेज पर हमारी परिभाषा दी गई है. आम तौर पर, Tink दो तरह की कंसिस्टेंसी उपलब्ध कराता है:

कॉन्टेक्स्ट

Tink, ये एपीआई उपलब्ध कराता है:

  • कीसेट में बदलाव करना: Tink, कीसेट में नई कुंजियां जोड़ने, कीसेट से कुंजियां हटाने, और कीसेट में प्राथमिक कुंजी बदलने के लिए एपीआई उपलब्ध कराता है.

  • कीसेट को क्रम में लगाना: Tink, कीसेट को बाइट के क्रम में लगाने के लिए एपीआई उपलब्ध कराता है. इसके उलट, बाइट के क्रम से कीसेट को पार्स करने के लिए भी एपीआई उपलब्ध कराता है.

  • प्रिमिटिव बनाना: Tink, कीसेट से प्रिमिटिव के लिए इंटरफ़ेस बनाने के लिए एक एपीआई उपलब्ध कराता है. उदाहरण के लिए, Java में कीसेट से Aead ऑब्जेक्ट बनाने के लिए, उपयोगकर्ता keysetHandle.getPrimitive(config, Aead.class) को कॉल करता है.

  • प्रिमिटिव का इस्तेमाल: प्रिमिटिव बनाने के चरण में जनरेट किया गया इंटरफ़ेस, क्रिप्टोग्राफ़िक ऑपरेशन करने के लिए एक एपीआई उपलब्ध कराता है.

इन एपीआई के बारे में दो अहम सवाल पूछे जा सकते हैं:

  • बनाना: सीरियलाइज़ किए गए किसी कीसेट, भाषा, और प्रिमिटिव के लिए, क्या इस कीसेट से भाषा में प्रिमिटिव बनाया जा सकता है?

  • आकलन: अगर किसी भाषा में दिए गए कीसेट से प्रिमिटिव बनाया जा सकता है, तो प्रिमिटिव ऑब्जेक्ट कैसे काम करता है?

यह ध्यान रखना ज़रूरी है कि कीसेट को पार्स करते समय, Tink एक जैसा नतीजा नहीं देता. उदाहरण के लिए, ऐसा हो सकता है कि Tink C++

  • CHACHA20-POLY1305 कुंजियों वाले कीसेट को पार्स कर सकता है. भले ही, Tink में CHACHA20-POLY1305 AEAD ऑपरेशन लागू न किए गए हों;
  • यह 1-बाइट की लंबाई वाली कुंजियों के साथ कीसेट को पार्स करता है. हालांकि, यह सभी क्रिप्टोग्राफ़िक कार्रवाइयों में काम नहीं करेगा.

माइनर वर्शन में, ये व्यवहार बदल सकते हैं.

आकलन करने की एक जैसी गतिविधि

मूल्यांकन की एकरूपता, निर्माण की प्रक्रिया में किसी भी एकरूपता से ज़्यादा ज़रूरी है: अगर Java में कोई AEAD, C++ में AEAD के एन्क्रिप्शन को डिक्रिप्ट नहीं कर सकता, तो उपयोगकर्ताओं को गंभीर समस्या होगी.

आम तौर पर, Tink का मकसद प्रिमिटिव के लिए, साफ़ तौर पर एक जैसा होना है. उदाहरण के लिए, अगर कोई C++ बाइनरी, public_key_sign->Sign(data) के साथ सिग्नेचर की गणना करती है, तो उससे जुड़े Java वेरिफिकेशन कॉल publicKeyVerify.verify(signature, data) के सफल होने की उम्मीद की जाती है.

हालांकि, यहां भी कुछ बातों का ध्यान रखना ज़रूरी है. उदाहरण के लिए, Java में aead.Encrypt का रिटर्न टाइप byte[] है. Java Language Specification (जेएलएस) §10.7 के मुताबिक, किसी कलेक्शन की लंबाई int टाइप की होती है. जेएलएस 4.2.1 के मुताबिक, यह ज़्यादा से ज़्यादा 2147483647 हो सकती है. इसलिए, Java में 2147483647 की लंबाई वाले ऐरे को एन्क्रिप्ट (सुरक्षित) नहीं किया जा सकता: एन्क्रिप्शन में कुछ ओवरहेड होता है. इसका मतलब है कि आउटपुट बहुत लंबा होगा. हालांकि, अन्य भाषाओं में इस तरह के इनपुट के लिए, एन्क्रिप्ट करने की अनुमति दी जाती है.

इसलिए, Tink में आकलन की प्रोसेस एक जैसी होती है: किसी दिए गए कीसेट के लिए, अगर दो भाषाओं में प्रिमिटिव बनाने की प्रोसेस पूरी हो जाती है, तो वे एक जैसा व्यवहार करते हैं.

हालांकि, कुछ खास मामलों में कुछ कार्रवाइयां पूरी नहीं हो पाती हैं.

कॉन्टेंट बनाने की फ़्रीक्वेंसी

सभी कीसेट के लिए, प्रिमिटिव बनाने की प्रोसेस हमेशा सफल नहीं होती. उदाहरण के लिए, अगर कुंजी के मटीरियल की लंबाई 128 बिट है, तो Tink उपयोगकर्ताओं को AesSivKey बनाने की अनुमति नहीं देता.

हालांकि, Tink इस तरह से एक जैसा अनुभव देता है: अगर दो भाषाएं किसी कुंजी के टाइप के साथ काम करती हैं, तो उन कुंजियों का सेट जिनके लिए प्रिमिटिव बनाया जा सकता है, एक जैसा होता है. अगर कोई भाषा किसी कुंजी टाइप के साथ काम नहीं करती है, तो कोई प्रिमिटिव ऑब्जेक्ट नहीं बनाया जा सकता.

कॉन्टेंट बनाने में एक जैसा तरीका अपनाने की तुलना में, कॉन्टेंट की समीक्षा करने में एक जैसा तरीका अपनाना ज़्यादा ज़रूरी है. साथ ही, कॉन्टेंट बनाने में एक जैसा तरीका अपनाने के नियम में, समीक्षा करने में एक जैसा तरीका अपनाने के नियम की तुलना में ज़्यादा अपवाद हैं. इन सीमाओं के बारे में, इस्तेमाल किए जा सकने वाले पासकोड के टाइप की हमारी सूची में बताया गया है. उदाहरण के लिए, Tink, ECIES टाइप की कुंजियों के लिए यह चुनने का विकल्प देता है कि की-एग्रीमेंट के लिए किस एलिप्टिक कर्व का इस्तेमाल करना है. हालांकि, Java में X25519 का इस्तेमाल नहीं किया जा सकता. इसलिए, Java में X25519 का इस्तेमाल करके कुंजी नहीं बनाई जा सकती.


  1. इस दस्तावेज़ में, हम Keyset शब्द का इस्तेमाल उस ऑब्जेक्ट के लिए करते हैं जिसे ज़्यादातर भाषाओं में KeysetHandle कहा जाता है. ↩