پردازنده cpu
استفاده از دستورهای AES و ضرب بدون نقلی پردازنده، و پرسیدن اینکه پردازنده چه دارد.
واردسازی پردازنده
نام آرگومانها شناسهی خود کد است و معادل فارسی ندارد؛ گونهها، کلیدواژهها و نام بستهها با معادل فارسی نوشته میشوند.
پردازندههای امروزی میتوانند یک دور از AES را اجرا کنند، یا دو مقدار ۶۴ بیتی را بدون نقلی در هم ضرب کنند، آن هم با یک دستور. این بسته آن دستورها را روی مقدارهای طبیعی۱۲۸ در دسترس میگذارد و هنگام اجرا میگوید ماشینی که برنامه روی آن است آنها را دارد یا نه. تی ال اس از آن برای AES-GCM بهره میبرد، پس پروتکلهای ویپیان و پراکسی و لایهی رکورد TLS خودشان از مسیر سریع میروند؛ بیشتر برنامهها هرگز لازم ندارند این بسته را صدا بزنند.
دستورها فقط وقتی واقعیاند که برنامه با پشتیبان LLVM ساخته شود، که هر نسخهی انتشار از آن استفاده میکند. در پشتیبان C و پشتیبان بومی و مفسر و مرورگر هر تابع باز هم کار میکند، اما بهصورت یک مدل نرمافزاری کند از دستور، و دارای رمز سخت افزاری نادرست است تا فراخوانها کد سریعتر خودشان را برگزینند. مدل نرمافزاری همان بایتها را میدهد، و همین است که آزمون میتواند دادهی یکسان را به هر دو راه اجرا کند.
چیزهایی که باید دانست:
- اول آزمون کنید، بعد صدا بزنید. توابع
دور رمزو همخانوادههایش همهجا کار میکنند، اما فقط جایی کهدارای رمز سخت افزاریدرست است هر کدام یک دستورند. - کلید هنگام ساخت رمز خوانده میشود.
تنظیم سخت افزار(نادرست)برای ای دی جدیدیا فراخوانی یکبارهی بعدی اثر میگذارد، نه بر بافتاری که از پیش هست. متغیر محیطیSALAM_NO_HWCRYPTOهمین را برای یک اجرای کامل میکند. ضرب بدون نقلیمقدار ثابت میخواهد. آرگومان سومش جزئی از دستور میشود، پس همانجا۰یا۱یا۱۶یا۱۷بنویسید، نه متغیر.- زمان ثابت. دستورها برای هر داده یکاندازه وقت میگیرند، چیزی که AES نرمافزاری جدولمحور نمیتواند تضمین کند.
مسیر سریع را با کند بسنجید
تنظیم سخت افزار مسیر سریع را خاموش میکند، پس یک برنامه میتواند همان پیام را به هر دو راه مهر کند و مقایسه کند. آزمونهای بسته هم همینطور بررسی میکنند که دو مسیر بایت یکسان میدهند. روی ماشینی که دستورها را ندارد، هر دو اجرا مسیر نرمافزاری را میروند و پاسخ باز هم یکی است.
واردسازی پردازنده
واردسازی حافظه
واردسازی تی ال اس
تابع شانزدهدهی(نشانی: تهی*، تعداد: صحیح): رشته:
بایتها := نشانی برگردان طبیعی۸*
ارقام := "0123456789abcdef"
ناپایا متن := ""
تکرار تعداد در ن:
مقدار := بایتها[ن] برگردان صحیح
متن += ارقام.زیررشته(مقدار >> 4، 1)
متن += ارقام.زیررشته(مقدار & 15، 1)
پایان
برگشت متن
پایان
تابع مهر کردن(): رشته:
کلید := حافظه.تخصیص صفرشده(16 برگردان طبیعی۶۴)
نانس := حافظه.تخصیص صفرشده(12 برگردان طبیعی۶۴)
پیام := حافظه.تخصیص صفرشده(32 برگردان طبیعی۶۴)
خروجی := حافظه.تخصیص صفرشده(48 برگردان طبیعی۶۴)
تی ال اس.مهر خام ای ای اس جی سی ام(کلید، 16، نانس، پوچ، 0، پیام، 32، خروجی)
نتیجه := شانزدهدهی(خروجی، 48)
حافظه.آزادسازی(کلید)
حافظه.آزادسازی(نانس)
حافظه.آزادسازی(پیام)
حافظه.آزادسازی(خروجی)
برگشت نتیجه
پایان
تابع ریشه:
پردازنده.تنظیم سخت افزار(درست)
سریع := مهر کردن()
پردازنده.تنظیم سخت افزار(نادرست)
کند := مهر کردن()
سرچاپ "بایتهای یکسان:"، سریع برابر کند
سرچاپ "برچسب:"، سریع.زیررشته(64، 32)
پایانسطر برچسب، برچسب ۳۲ بایت صفر زیر کلید و نانس صفر است؛ الگوریتم آن را معین میکند و روی هر ماشین یکی است.
کدام تابع برای کدام کار
| کار | استفاده |
|---|---|
| مسیر سریع هست و روشن است؟ | دارای رمز سخت افزاری |
| کدام خانوادهی پردازنده؟ | دارای ای ای اس ان آی (x86-64)، دارای رمز آرم (AArch64)، یا بیتهای ویژگی های پردازنده |
| واداشتن مسیر نرمافزاری | تنظیم سخت افزار(نادرست) یا SALAM_NO_HWCRYPTO=1 |
| یک دور AES روی یک بلوک | دور رمز و دور آخر رمز |
| حاصلضرب بدون نقلی، مثل GHASH | ضرب بدون نقلی |
| بردن بلوک به حافظه و آوردنش | بارگیری شانزده بایت و ذخیره شانزده بایت |
| وارونه کردن بایتهای بلوک، یا جابهجایی نیمههایش | وارونه سازی بایت ها و جابجایی نیمه ها |
پایاها و متغیرها
ویژگی رمز سخت افزاری FEATURE_HW_CRYPTO
پایا ویژگی رمز سخت افزاری: صحیح۳۲ = 1ویژگی های پردازنده که میگوید دستورهای AES و ضرب بدون نقلی هست و برنامه برای بهکار بردنشان ساخته شده است.واردسازی پردازنده
واردسازی حافظه
تابع نمایش(برچسب: رشته، مقدار: طبیعی۱۲۸):
بافر := حافظه.تخصیص صفرشده(16 برگردان طبیعی۶۴)
پردازنده.ذخیره شانزده بایت(بافر، مقدار)
نشانی := بافر برگردان طبیعی۸*
ارقام := "0123456789abcdef"
ناپایا متن := ""
تکرار 16 در ن:
بایت := نشانی[ن] برگردان صحیح
متن += ارقام.زیررشته(بایت >> 4، 1)
متن += ارقام.زیررشته(بایت & 15، 1)
پایان
سرچاپ برچسب، متن
حافظه.آزادسازی(بافر)
پایان
تابع ریشه:
بافر := حافظه.تخصیص صفرشده(16 برگردان طبیعی۶۴)
نشانی := بافر برگردان طبیعی۸*
تکرار 16 در ن:
نشانی[ن] = (ن * 17) برگردان طبیعی۸
پایان
ایکس := پردازنده.بارگیری شانزده بایت(بافر)
نمایش("بارگیری "، ایکس)
نمایش("دور "، پردازنده.دور رمز(ایکس، ایکس))
نمایش("دور آخر "، پردازنده.دور آخر رمز(ایکس، ایکس))
نمایش("ضرب "، پردازنده.ضرب بدون نقلی(ایکس، ایکس، 0))
نمایش("ضرب بالا"، پردازنده.ضرب بدون نقلی(ایکس، ایکس، 17))
نمایش("جابجایی "، پردازنده.جابجایی نیمه ها(ایکس))
نمایش("وارونه "، پردازنده.وارونه سازی بایت ها(ایکس))
پردازنده.تنظیم سخت افزار(نادرست)
سرچاپ "خاموش:"، پردازنده.دارای رمز سخت افزاری()
پردازنده.تنظیم سخت افزار(درست)
ویژگیها := پردازنده.ویژگی های پردازنده()
هست := (ویژگیها & پردازنده.ویژگی رمز سخت افزاری) نابرابر 0
سرچاپ "روشن با پردازنده میخواند:"، پردازنده.دارای رمز سخت افزاری() برابر هست
سرچاپ "خانوادهها میخوانند:"، پردازنده.دارای ای ای اس ان آی() برابر (هست و (ویژگیها & پردازنده.ویژگی ایکس۸۶) نابرابر 0)، پردازنده.دارای رمز آرم() برابر (هست و (ویژگیها & پردازنده.ویژگی آرم۶۴) نابرابر 0)، پردازنده.دارای ضرب بدون نقلی() برابر پردازنده.دارای ای ای اس ان آی()
حافظه.آزادسازی(بافر)
پایانویژگی ایکس۸۶ FEATURE_X86
پایا ویژگی ایکس۸۶: صحیح۳۲ = 2ویژگی های پردازنده که میگوید پردازنده x86-64 است (AES-NI و PCLMULQDQ).نمونهی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam
ویژگی آرم۶۴ FEATURE_ARM64
پایا ویژگی آرم۶۴: صحیح۳۲ = 4ویژگی های پردازنده که میگوید پردازنده AArch64 است (افزونههای رمز).نمونهی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam
تابعها
ویژگی های پردازنده Features
تابع ویژگی های پردازنده(): صحیحویژگی رمز سخت افزاری همراه با ویژگی ایکس۸۶ یا ویژگی آرم۶۴. اگر پشتیبان دستورها را پایین نبرد یا پردازنده نداشته باشد ۰ است.نمونهی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam
دور رمز HwAesEnc
تابع دور رمز(state: طبیعی۱۲۸، key: طبیعی۱۲۸): طبیعی۱۲۸aesenc در x86 (جایگزینی بایت، جابهجایی سطر، آمیختن ستون و سپس xor با کلید دور). بلوک همان ۱۶ بایت به ترتیب حافظه است که بهصورت طبیعی۱۲۸ کوچکپایان خوانده میشود.نمونهی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam
دور آخر رمز HwAesEncLast
تابع دور آخر رمز(state: طبیعی۱۲۸، key: طبیعی۱۲۸): طبیعی۱۲۸aesenclast در x86.نمونهی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam
ضرب بدون نقلی HwClmul
تابع ضرب بدون نقلی(a: طبیعی۱۲۸، b: طبیعی۱۲۸، imm: صحیح): طبیعی۱۲۸a و یکی از b بهصورت نتیجهی ۱۲۸ بیتی. بیت ۰ از imm نیمهی a را برمیگزیند و بیت ۴ نیمهی b را، مثل pclmulqdq. باید عدد صحیح ثابت باشد.نمونهی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam
جابجایی نیمه ها HwSwap64
تابع جابجایی نیمه ها(x: طبیعی۱۲۸): طبیعی۱۲۸نمونهی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam
وارونه سازی بایت ها HwBswap
تابع وارونه سازی بایت ها(x: طبیعی۱۲۸): طبیعی۱۲۸نمونهی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam
بارگیری شانزده بایت HwLoad
تابع بارگیری شانزده بایت(p: تهی*): طبیعی۱۲۸نمونهی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam
ذخیره شانزده بایت HwStore
تابع ذخیره شانزده بایت(p: تهی*، x: طبیعی۱۲۸)نمونهی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam
تنظیم سخت افزار SetHardware
تابع تنظیم سخت افزار(enable: منطقی)نمونهی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam
دارای رمز سخت افزاری HasHardwareCrypto
تابع دارای رمز سخت افزاری(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam
دارای ای ای اس ان آی HasAesNi
تابع دارای ای ای اس ان آی(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam
دارای ضرب بدون نقلی HasPclmul
تابع دارای ضرب بدون نقلی(): منطقیدارای ای ای اس ان آی برابر است.نمونهی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam
دارای رمز آرم HasArmCrypto
تابع دارای رمز آرم(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam