کتابخانه‌ی استاندارد · سیستم و ابزار

پردازنده cpu

استفاده از دستورهای AES و ضرب بدون نقلی پردازنده، و پرسیدن این‌که پردازنده چه دارد.

واردسازی پردازنده

نام آرگومان‌ها شناسه‌ی خود کد است و معادل فارسی ندارد؛ گونه‌ها، کلیدواژه‌ها و نام بسته‌ها با معادل فارسی نوشته می‌شوند.

پردازنده‌های امروزی می‌توانند یک دور از AES را اجرا کنند، یا دو مقدار ۶۴ بیتی را بدون نقلی در هم ضرب کنند، آن هم با یک دستور. این بسته آن دستورها را روی مقدارهای طبیعی۱۲۸ در دسترس می‌گذارد و هنگام اجرا می‌گوید ماشینی که برنامه روی آن است آن‌ها را دارد یا نه. تی ال اس از آن برای AES-GCM بهره می‌برد، پس پروتکل‌های وی‌پی‌ان و پراکسی و لایه‌ی رکورد TLS خودشان از مسیر سریع می‌روند؛ بیشتر برنامه‌ها هرگز لازم ندارند این بسته را صدا بزنند.

دستورها فقط وقتی واقعی‌اند که برنامه با پشتیبان LLVM ساخته شود، که هر نسخه‌ی انتشار از آن استفاده می‌کند. در پشتیبان C و پشتیبان بومی و مفسر و مرورگر هر تابع باز هم کار می‌کند، اما به‌صورت یک مدل نرم‌افزاری کند از دستور، و دارای رمز سخت افزاری نادرست است تا فراخوان‌ها کد سریع‌تر خودشان را برگزینند. مدل نرم‌افزاری همان بایت‌ها را می‌دهد، و همین است که آزمون می‌تواند داده‌ی یکسان را به هر دو راه اجرا کند.

چیزهایی که باید دانست:

  • اول آزمون کنید، بعد صدا بزنید. توابع دور رمز و هم‌خانواده‌هایش همه‌جا کار می‌کنند، اما فقط جایی که دارای رمز سخت افزاری درست است هر کدام یک دستورند.
  • کلید هنگام ساخت رمز خوانده می‌شود. تنظیم سخت افزار(نادرست) بر ای ای دی جدید یا فراخوانی یک‌باره‌ی بعدی اثر می‌گذارد، نه بر بافتاری که از پیش هست. متغیر محیطی SALAM_NO_HWCRYPTO همین را برای یک اجرای کامل می‌کند.
  • ضرب بدون نقلی مقدار ثابت می‌خواهد. آرگومان سومش جزئی از دستور می‌شود، پس همان‌جا ۰ یا ۱ یا ۱۶ یا ۱۷ بنویسید، نه متغیر.
  • زمان ثابت. دستورها برای هر داده یک‌اندازه وقت می‌گیرند، چیزی که AES نرم‌افزاری جدول‌محور نمی‌تواند تضمین کند.

مسیر سریع را با کند بسنجید

تنظیم سخت افزار مسیر سریع را خاموش می‌کند، پس یک برنامه می‌تواند همان پیام را به هر دو راه مهر کند و مقایسه کند. آزمون‌های بسته هم همین‌طور بررسی می‌کنند که دو مسیر بایت یکسان می‌دهند. روی ماشینی که دستورها را ندارد، هر دو اجرا مسیر نرم‌افزاری را می‌روند و پاسخ باز هم یکی است.

cpu-guide-switch.salam
واردسازی پردازنده
واردسازی حافظه
واردسازی تی ال اس

تابع شانزده‌دهی(نشانی: تهی*، تعداد: صحیح): رشته:
    بایت‌ها := نشانی برگردان طبیعی۸*
    ارقام := "0123456789abcdef"
    ناپایا متن := ""
    تکرار تعداد در ن:
        مقدار := بایت‌ها[ن] برگردان صحیح
        متن += ارقام.زیررشته(مقدار >> 4، 1)
        متن += ارقام.زیررشته(مقدار & 15، 1)
    پایان
    برگشت متن
پایان

تابع مهر کردن(): رشته:
    کلید := حافظه.تخصیص صفرشده(16 برگردان طبیعی۶۴)
    نانس := حافظه.تخصیص صفرشده(12 برگردان طبیعی۶۴)
    پیام := حافظه.تخصیص صفرشده(32 برگردان طبیعی۶۴)
    خروجی := حافظه.تخصیص صفرشده(48 برگردان طبیعی۶۴)
    تی ال اس.مهر خام ای ای اس جی سی ام(کلید، 16، نانس، پوچ، 0، پیام، 32، خروجی)
    نتیجه := شانزده‌دهی(خروجی، 48)
    حافظه.آزادسازی(کلید)
    حافظه.آزادسازی(نانس)
    حافظه.آزادسازی(پیام)
    حافظه.آزادسازی(خروجی)
    برگشت نتیجه
پایان

تابع ریشه:
    پردازنده.تنظیم سخت افزار(درست)
    سریع := مهر کردن()
    پردازنده.تنظیم سخت افزار(نادرست)
    کند := مهر کردن()
    سرچاپ "بایت‌های یکسان:"، سریع برابر کند
    سرچاپ "برچسب:"، سریع.زیررشته(64، 32)
پایان
خروجیبایت‌های یکسان: true برچسب: 40490af4805606b2a3a2e793e3500066

سطر برچسب، برچسب ۳۲ بایت صفر زیر کلید و نانس صفر است؛ الگوریتم آن را معین می‌کند و روی هر ماشین یکی است.

کدام تابع برای کدام کار

کاراستفاده
مسیر سریع هست و روشن است؟دارای رمز سخت افزاری
کدام خانواده‌ی پردازنده؟دارای ای ای اس ان آی (x86-64)، دارای رمز آرم (AArch64)، یا بیت‌های ویژگی های پردازنده
واداشتن مسیر نرم‌افزاریتنظیم سخت افزار(نادرست) یا SALAM_NO_HWCRYPTO=1
یک دور AES روی یک بلوکدور رمز و دور آخر رمز
حاصل‌ضرب بدون نقلی، مثل GHASHضرب بدون نقلی
بردن بلوک به حافظه و آوردنشبارگیری شانزده بایت و ذخیره شانزده بایت
وارونه کردن بایت‌های بلوک، یا جابه‌جایی نیمه‌هایشوارونه سازی بایت ها و جابجایی نیمه ها

پایاها و متغیرها

ویژگی رمز سخت افزاری FEATURE_HW_CRYPTO

پایا ویژگی رمز سخت افزاری: صحیح۳۲ = 1
بیتی از ویژگی های پردازنده که می‌گوید دستورهای AES و ضرب بدون نقلی هست و برنامه برای به‌کار بردنشان ساخته شده است.
cpu-Intrinsics.salam
واردسازی پردازنده
واردسازی حافظه

تابع نمایش(برچسب: رشته، مقدار: طبیعی۱۲۸):
    بافر := حافظه.تخصیص صفرشده(16 برگردان طبیعی۶۴)
    پردازنده.ذخیره شانزده بایت(بافر، مقدار)
    نشانی := بافر برگردان طبیعی۸*
    ارقام := "0123456789abcdef"
    ناپایا متن := ""
    تکرار 16 در ن:
        بایت := نشانی[ن] برگردان صحیح
        متن += ارقام.زیررشته(بایت >> 4، 1)
        متن += ارقام.زیررشته(بایت & 15، 1)
    پایان
    سرچاپ برچسب، متن
    حافظه.آزادسازی(بافر)
پایان

تابع ریشه:
    بافر := حافظه.تخصیص صفرشده(16 برگردان طبیعی۶۴)
    نشانی := بافر برگردان طبیعی۸*
    تکرار 16 در ن:
        نشانی[ن] = (ن * 17) برگردان طبیعی۸
    پایان
    ایکس := پردازنده.بارگیری شانزده بایت(بافر)
    نمایش("بارگیری "، ایکس)
    نمایش("دور     "، پردازنده.دور رمز(ایکس، ایکس))
    نمایش("دور آخر "، پردازنده.دور آخر رمز(ایکس، ایکس))
    نمایش("ضرب     "، پردازنده.ضرب بدون نقلی(ایکس، ایکس، 0))
    نمایش("ضرب بالا"، پردازنده.ضرب بدون نقلی(ایکس، ایکس، 17))
    نمایش("جابجایی "، پردازنده.جابجایی نیمه ها(ایکس))
    نمایش("وارونه  "، پردازنده.وارونه سازی بایت ها(ایکس))
    پردازنده.تنظیم سخت افزار(نادرست)
    سرچاپ "خاموش:"، پردازنده.دارای رمز سخت افزاری()
    پردازنده.تنظیم سخت افزار(درست)
    ویژگی‌ها := پردازنده.ویژگی های پردازنده()
    هست := (ویژگی‌ها & پردازنده.ویژگی رمز سخت افزاری) نابرابر 0
    سرچاپ "روشن با پردازنده می‌خواند:"، پردازنده.دارای رمز سخت افزاری() برابر هست
    سرچاپ "خانواده‌ها می‌خوانند:"، پردازنده.دارای ای ای اس ان آی() برابر (هست و (ویژگی‌ها & پردازنده.ویژگی ایکس۸۶) نابرابر 0)، پردازنده.دارای رمز آرم() برابر (هست و (ویژگی‌ها & پردازنده.ویژگی آرم۶۴) نابرابر 0)، پردازنده.دارای ضرب بدون نقلی() برابر پردازنده.دارای ای ای اس ان آی()
    حافظه.آزادسازی(بافر)
پایان
خروجیبارگیری 00112233445566778899aabbccddeeff دور 6368c4eab0329d01259f964f1e36645c دور آخر 63ed8e255fbb4eb44c58394e875fdd15 ضرب 00000101040405051010111114141515 ضرب بالا 40404141444445455050515154545555 جابجایی 8899aabbccddeeff0011223344556677 وارونه ffeeddccbbaa99887766554433221100 خاموش: false روشن با پردازنده می‌خواند: true خانواده‌ها می‌خوانند: true true true

ویژگی ایکس۸۶ 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: طبیعی۱۲۸): طبیعی۱۲۸
یک دور AES روی یک بلوک، همان aesenc در x86 (جایگزینی بایت، جابه‌جایی سطر، آمیختن ستون و سپس xor با کلید دور). بلوک همان ۱۶ بایت به ترتیب حافظه است که به‌صورت طبیعی۱۲۸ کوچک‌پایان خوانده می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam

دور آخر رمز HwAesEncLast

تابع دور آخر رمز(state: طبیعی۱۲۸، key: طبیعی۱۲۸): طبیعی۱۲۸
دور آخر AES، بی آمیختن ستون، همان 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

تابع دارای ای ای اس ان آی(): منطقی
درست روی پردازنده‌ی x86-64 با AES-NI و PCLMULQDQ و SSSE3 و SSE4.1، وقتی ساخت برنامه از آن‌ها استفاده می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam

دارای ضرب بدون نقلی HasPclmul

تابع دارای ضرب بدون نقلی(): منطقی
درست وقتی ضرب بدون نقلی در دسترس است؛ همراه با AES بررسی می‌شود، پس با دارای ای ای اس ان آی برابر است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam

دارای رمز آرم HasArmCrypto

تابع دارای رمز آرم(): منطقی
درست روی پردازنده‌ی AArch64 با دستورهای AES و PMULL، وقتی ساخت برنامه از آن‌ها استفاده می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: cpu-Intrinsics.salam