এই পৃষ্ঠাটি KeyMint হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) বাস্তবায়নকারীদের সহায়তা করার জন্য অতিরিক্ত বিবরণ এবং নির্দেশিকা প্রদান করে। HAL-এর প্রাথমিক ডকুমেন্টেশন হলো AIDL ইন্টারফেস স্পেসিফিকেশন ।
এপিআই অপব্যবহার
কলকারীরা এমন অনুমোদন ব্যবহার করে KeyMint কী তৈরি করতে পারে যা API প্যারামিটার হিসেবে বৈধ, কিন্তু যার ফলে তৈরি হওয়া কী-গুলো অসুরক্ষিত বা অব্যবহারযোগ্য হয়ে পড়ে। এই ধরনের ক্ষেত্রে KeyMint ইমপ্লিমেন্টেশনগুলোর ব্যর্থ হওয়া বা কোনো ডায়াগনস্টিক জারি করার বাধ্যবাধকতা নেই। খুব ছোট কী-এর ব্যবহার, অপ্রাসঙ্গিক ইনপুট প্যারামিটার নির্দিষ্ট করা, IV বা nonce-এর পুনঃব্যবহার, উদ্দেশ্যহীন (এবং ফলস্বরূপ অকেজো) কী তৈরি করা, এবং এই জাতীয় বিষয়গুলো ইমপ্লিমেন্টেশনগুলোর দ্বারা ডায়াগনোজ করা উচিত নয়।
KeyMint মডিউলগুলিতে করা কলগুলি যেন যৌক্তিক এবং কার্যকর হয়, তা নিশ্চিত করা অ্যাপ, ফ্রেমওয়ার্ক এবং অ্যান্ড্রয়েড কীস্টোরের দায়িত্ব।
addRngEntropy এন্ট্রি পয়েন্ট
addRngEntropy এন্ট্রি পয়েন্টটি, কী (key) এবং IVs (IVs)-এর জন্য র্যান্ডম নম্বর তৈরি করতে KeyMint ইমপ্লিমেন্টেশন দ্বারা ব্যবহৃত পুলে কলার-প্রদত্ত এনট্রপি যোগ করে।
KeyMint ইমপ্লিমেন্টেশনগুলোকে অবশ্যই প্রদত্ত এনট্রপিকে তাদের পুলে নিরাপদে মিশ্রিত করতে হবে, যেটিতে একটি হার্ডওয়্যার র্যান্ডম নম্বর জেনারেটর থেকে অভ্যন্তরীণভাবে উৎপন্ন এনট্রপিও অবশ্যই থাকতে হবে। এই মিশ্রণ এমনভাবে পরিচালনা করা উচিত যাতে কোনো আক্রমণকারী, যার addRngEntropy প্রদত্ত বিটগুলো অথবা হার্ডওয়্যার-উৎপাদিত বিটগুলোর (উভয়ের উপর নয়) যেকোনো একটির উপর সম্পূর্ণ নিয়ন্ত্রণ রয়েছে, সেও এনট্রপি পুল থেকে উৎপন্ন বিটগুলো অনুমান করার ক্ষেত্রে উল্লেখযোগ্য কোনো সুবিধা না পায়।
মূল বৈশিষ্ট্য
KeyMint কী তৈরি করার প্রতিটি প্রক্রিয়া ( generateKey , importKey , এবং importWrappedKey ) নতুন তৈরি হওয়া কী-টির বৈশিষ্ট্যগুলো ফেরত দেয়, যা প্রতিটি বৈশিষ্ট্য প্রয়োগকারী নিরাপত্তা স্তর অনুযায়ী যথাযথভাবে বিভক্ত থাকে। ফেরত আসা বৈশিষ্ট্যগুলোর মধ্যে কী তৈরির জন্য নির্দিষ্ট করা সমস্ত প্যারামিটার অন্তর্ভুক্ত থাকে, শুধুমাত্র Tag::APPLICATION_ID এবং Tag::APPLICATION_DATA ছাড়া। যদি এই ট্যাগগুলো কী-এর প্যারামিটারে অন্তর্ভুক্ত থাকে, তবে ফেরত আসা বৈশিষ্ট্যগুলো থেকে এগুলো সরিয়ে ফেলা হয়, যাতে ফেরত আসা কী-ব্লব পরীক্ষা করে এদের মান খুঁজে পাওয়া সম্ভব না হয়। তবে, এগুলো ক্রিপ্টোগ্রাফিকভাবে কী-ব্লবের সাথে আবদ্ধ থাকে, ফলে কী ব্যবহার করার সময় সঠিক মান প্রদান করা না হলে এর ব্যবহার ব্যর্থ হয়। একইভাবে, Tag::ROOT_OF_TRUST ক্রিপ্টোগ্রাফিকভাবে কী-এর সাথে আবদ্ধ থাকে, কিন্তু এটি কী তৈরি বা ইম্পোর্ট করার সময় নির্দিষ্ট করা যায় না এবং এটি কখনও ফেরত আসে না।
প্রদত্ত ট্যাগগুলোর পাশাপাশি, KeyMint ইমপ্লিমেন্টেশনটি Tag::ORIGIN ও যোগ করে, যা নির্দেশ করে কী-টি কোন পদ্ধতিতে তৈরি করা হয়েছিল ( KeyOrigin::GENERATED , KeyOrigin::IMPORTED , অথবা KeyOrigin::SECURELY_IMPORTED )।
পশ্চাদপসরণ প্রতিরোধ
রোলব্যাক প্রতিরোধ ক্ষমতা Tag::ROLLBACK_RESISTANCE দ্বারা নির্দেশিত হয়, এবং এর অর্থ হলো, একবার deleteKey বা deleteAllKeys ব্যবহার করে কোনো কী মুছে ফেলা হলে, সুরক্ষিত হার্ডওয়্যার নিশ্চিত করে যে সেটি আর কখনো ব্যবহারযোগ্য থাকবে না।
KeyMint ইমপ্লিমেন্টেশনগুলো তৈরি করা বা ইম্পোর্ট করা কী মেটেরিয়ালকে কলারের কাছে একটি কীব্লব হিসেবে ফেরত দেয়, যা একটি এনক্রিপ্টেড এবং অথেনটিকেটেড ফর্ম। যখন Keystore কীব্লবটি ডিলিট করে দেয়, তখন কী-টিও হারিয়ে যায়, কিন্তু কোনো আক্রমণকারী যদি আগে কী মেটেরিয়ালটি পুনরুদ্ধার করতে সক্ষম হয়ে থাকে, তবে সে সম্ভবত ডিভাইসটিতে তা পুনরুদ্ধার করতে পারে।
একটি কী-কে রোলব্যাক-প্রতিরোধী বলা হয় যদি সুরক্ষিত হার্ডওয়্যারটি নিশ্চিত করে যে মুছে ফেলা কীগুলো পরবর্তীতে পুনরুদ্ধার করা যাবে না। এটি সাধারণত একটি বিশ্বস্ত স্থানে অতিরিক্ত কী মেটাডেটা সংরক্ষণ করার মাধ্যমে করা হয়, যা কোনো আক্রমণকারী দ্বারা পরিবর্তন করা যায় না। মোবাইল ডিভাইসে, এর জন্য ব্যবহৃত পদ্ধতিটি সাধারণত রিপ্লে প্রোটেক্টেড মেমোরি ব্লক (RPMB)। যেহেতু তৈরি করা যায় এমন কী-এর সংখ্যা কার্যত অসীম এবং রোলব্যাক প্রতিরোধের জন্য ব্যবহৃত বিশ্বস্ত স্টোরেজের আকার সীমিত হতে পারে, তাই স্টোরেজ পূর্ণ হয়ে গেলে ইমপ্লিমেন্টেশনটি রোলব্যাক-প্রতিরোধী কী তৈরির অনুরোধগুলো ব্যর্থ করে দিতে পারে।
শুরু করুন
begin() এন্ট্রি পয়েন্টটি নির্দিষ্ট কী ব্যবহার করে, নির্দিষ্ট উদ্দেশ্যে এবং (প্রয়োজন অনুযায়ী) নির্দিষ্ট প্যারামিটারসহ একটি ক্রিপ্টোগ্রাফিক অপারেশন শুরু করে। এটি একটি নতুন IKeyMintOperation Binder অবজেক্ট রিটার্ন করে যা অপারেশনটি সম্পন্ন করতে ব্যবহৃত হয়। এছাড়াও, একটি চ্যালেঞ্জ ভ্যালু রিটার্ন করা হয় যা অথেনটিকেটেড অপারেশনে অথেনটিকেশন টোকেনের অংশ হিসেবে ব্যবহৃত হয়।
একটি KeyMint ইমপ্লিমেন্টেশন কমপক্ষে ১৬টি কনকারেন্ট অপারেশন সমর্থন করে। Keystore সর্বোচ্চ ১৫টি ব্যবহার করে, এবং একটি vold এর জন্য পাসওয়ার্ড এনক্রিপশনের কাজে ব্যবহৃত হয়। যখন Keystore-এর ১৫টি অপারেশন চলমান থাকে ( begin() কল করা হয়েছে, কিন্তু finish বা abort কল করা হয়নি) এবং এটি ১৬তম অপারেশনটি শুরু করার জন্য একটি অনুরোধ পায়, তখন এটি নতুন অনুরোধ করা অপারেশনটি শুরু করার জন্য begin() কল করার আগে, সক্রিয় অপারেশনের সংখ্যা ১৪-তে নামিয়ে আনার জন্য সবচেয়ে কম ব্যবহৃত অপারেশনটিতে abort() কল করে।
যদি কী জেনারেশন বা ইম্পোর্টের সময় Tag::APPLICATION_ID বা Tag::APPLICATION_DATA নির্দিষ্ট করা হয়ে থাকে, তাহলে begin() কলে অবশ্যই এই মেথডের params আর্গুমেন্টে প্রাথমিকভাবে নির্দিষ্ট করা মানসহ সেই ট্যাগগুলো অন্তর্ভুক্ত করতে হবে।
ত্রুটি পরিচালনা
যদি একটি IKeyMintOperation এর কোনো মেথড ErrorCode::OK ছাড়া অন্য কোনো এরর কোড রিটার্ন করে, তাহলে অপারেশনটি বাতিল হয়ে যায় এবং অপারেশন বাইন্ডার অবজেক্টটি অবৈধ হয়ে যায়। ভবিষ্যতে অবজেক্টটির যেকোনো ব্যবহারে ErrorCode::INVALID_OPERATION_HANDLE রিটার্ন করা হয়।
অনুমোদন প্রয়োগ
কী অথরাইজেশন প্রয়োগ মূলত begin() ফাংশনে সম্পন্ন করা হয়। এর একমাত্র ব্যতিক্রম হলো সেই ক্ষেত্র, যেখানে কী-টির এক বা একাধিক Tag::USER_SECURE_ID ভ্যালু থাকে, কিন্তু কোনো Tag::AUTH_TIMEOUT ভ্যালু থাকে না।
এক্ষেত্রে, প্রতিটি অপারেশনের জন্য কী-টির একটি অনুমোদনের প্রয়োজন হয়, এবং update() বা finish() মেথডগুলো authToken আর্গুমেন্টে একটি অথ টোকেন গ্রহণ করে। টোকেনটি বৈধ কিনা তা নিশ্চিত করতে, KeyMint ইমপ্লিমেন্টেশনটি:
- অথ টোকেনে থাকা HMAC সিগনেচার যাচাই করে।
- যাচাই করে দেখা হয় যে টোকেনটিতে কী-এর সাথে যুক্ত আইডির সাথে মেলে এমন একটি সুরক্ষিত ইউজার আইডি রয়েছে।
- টোকেনের অথোরাইজেশন টাইপটি কী-এর
Tag::USER_AUTH_TYPEসাথে মেলে কিনা তা যাচাই করে। - যাচাই করে দেখা হয় যে টোকেনটির চ্যালেঞ্জ ফিল্ডে বর্তমান অপারেশনের জন্য চ্যালেঞ্জ ভ্যালুটি রয়েছে কি না।
এই শর্তগুলো পূরণ না হলে, KeyMint ErrorCode::KEY_USER_NOT_AUTHENTICATED রিটার্ন করে।
কলার প্রতিটি update() এবং finish() কলে অথেনটিকেশন টোকেন প্রদান করে। ইমপ্লিমেন্টেশনটি টোকেনটি শুধুমাত্র একবারই ভ্যালিডেট করতে পারে।