<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 15">
<meta name="Originator" content="Microsoft Word 15">
<link rel="File-List" href="cid:filelist.xml@01D5DB35.2F7C69D0"><!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:DocumentKind>DocumentEmail</w:DocumentKind>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:EnvelopeVis/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:DoNotExpandShiftReturn/>
<w:BreakWrappedTables/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false" DefSemiHidden="false" DefQFormat="false" DefPriority="99" LatentStyleCount="375">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true" UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true" UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Mention"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Smart Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Hashtag"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Unresolved Mention"/>
</w:LatentStyles>
</xml><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;
        mso-font-alt:"Calisto MT";
        mso-font-charset:0;
        mso-generic-font-family:roman;
        mso-font-pitch:variable;
        mso-font-signature:-536869121 1107305727 33554432 0 415 0;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;
        mso-font-alt:"Times New Roman";
        mso-font-charset:0;
        mso-generic-font-family:swiss;
        mso-font-pitch:variable;
        mso-font-signature:-536858881 -1073732485 9 0 511 0;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;
        mso-font-charset:0;
        mso-generic-font-family:modern;
        mso-font-pitch:fixed;
        mso-font-signature:-536869121 64767 1 0 415 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {mso-style-unhide:no;
        mso-style-qformat:yes;
        mso-style-parent:"";
        margin:0in;
        margin-bottom:.0001pt;
        mso-pagination:widow-orphan;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-font-family:Calibri;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;
        text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-noshow:yes;
        mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;
        text-underline:single;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-style-unhide:no;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        mso-pagination:widow-orphan;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-font-family:Calibri;}
span.EmailStyle18
        {mso-style-type:personal;
        mso-style-noshow:yes;
        mso-style-unhide:no;
        font-family:"Calibri",sans-serif;
        mso-ascii-font-family:Calibri;
        mso-hansi-font-family:Calibri;
        mso-bidi-font-family:Calibri;
        color:black;
        mso-text-animation:none;
        font-weight:normal;
        font-style:normal;
        text-decoration:none;
        text-underline:none;
        text-decoration:none;
        text-line-through:none;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        mso-style-noshow:yes;
        mso-style-unhide:no;
        mso-ansi-font-size:11.0pt;
        mso-bidi-font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-ascii-font-family:Calibri;
        mso-fareast-font-family:Calibri;
        mso-hansi-font-family:Calibri;
        mso-bidi-font-family:"Times New Roman";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        mso-default-props:yes;
        font-size:10.0pt;
        mso-ansi-font-size:10.0pt;
        mso-bidi-font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;
        mso-header-margin:.5in;
        mso-footer-margin:.5in;
        mso-paper-source:0;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 10]><style>/* Style Definitions */
table.MsoNormalTable
        {mso-style-name:"Table Normal";
        mso-tstyle-rowband-size:0;
        mso-tstyle-colband-size:0;
        mso-style-noshow:yes;
        mso-style-priority:99;
        mso-style-parent:"";
        mso-padding-alt:0in 5.4pt 0in 5.4pt;
        mso-para-margin:0in;
        mso-para-margin-bottom:.0001pt;
        mso-pagination:widow-orphan;
        font-size:10.0pt;
        font-family:"Times New Roman",serif;}
</style><![endif]--><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72" style="tab-interval:.5in">
<div class="WordSection1">
<p class="MsoNormal"><span style="mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:"Times New Roman"">Hi Chao,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:"Times New Roman""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:"Times New Roman"">I do not think the HashApiLib in CryptoPkg should depend on a PCD in SecurityPkg and have<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:"Times New Roman"">a dependency on TPM related concepts.<span style="mso-spacerun:yes"> 
</span>The HashApiLib is a layer on top of BaseCryptLib<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:"Times New Roman"">that may support algorithms not supported by TPM.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:"Times New Roman""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:"Times New Roman"">If the TCG/TPM specs have defined support for more algorithms, then I agree that the<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:"Times New Roman"">SecurityPkg can be updated to align with the latest specs.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:"Times New Roman""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:"Times New Roman"">Mike<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:"Times New Roman""><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="mso-fareast-font-family:"Times New Roman"">From:</span></b><span style="mso-fareast-font-family:"Times New Roman""> Zhang, Chao B <chao.b.zhang@intel.com>
<br>
<b>Sent:</b> Monday, February 3, 2020 9:25 PM<br>
<b>To:</b> devel@edk2.groups.io; Yao, Jiewen <jiewen.yao@intel.com>; Kinney, Michael D <michael.d.kinney@intel.com><br>
<b>Cc:</b> Sukerkar, Amol N <amol.n.sukerkar@intel.com>; Wang, Jian J <jian.j.wang@intel.com><br>
<b>Subject:</b> RE: [edk2-devel] [Patch v10 2/2] CryptoPkg/BaseHashApiLib: Implement Unified Hash Calculation API<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="color:black;mso-fareast-language:ZH-CN">Comply with gEfiSecurityPkgTokenSpaceGuid.PcdTpm2HashMask is better.
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:black;mso-fareast-language:ZH-CN">We can append new definition after existing one.<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0;mso-fareast-language:ZH-CN">#define</span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6;mso-fareast-language:ZH-CN"> HASH_ALG_SHA1    </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8;mso-fareast-language:ZH-CN">0x00000001</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4;mso-fareast-language:ZH-CN"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0;mso-fareast-language:ZH-CN">#define</span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6;mso-fareast-language:ZH-CN"> HASH_ALG_SHA256  </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8;mso-fareast-language:ZH-CN">0x00000002</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4;mso-fareast-language:ZH-CN"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0;mso-fareast-language:ZH-CN">#define</span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6;mso-fareast-language:ZH-CN"> HASH_ALG_SHA384  </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8;mso-fareast-language:ZH-CN">0x00000004</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4;mso-fareast-language:ZH-CN"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0;mso-fareast-language:ZH-CN">#define</span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6;mso-fareast-language:ZH-CN"> HASH_ALG_SHA512  </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8;mso-fareast-language:ZH-CN">0x00000008</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4;mso-fareast-language:ZH-CN"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0;mso-fareast-language:ZH-CN">#define</span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6;mso-fareast-language:ZH-CN"> HASH_ALG_SM3_256 </span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8;mso-fareast-language:ZH-CN">0x00000010</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4;mso-fareast-language:ZH-CN"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4;mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:black;mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="mso-outline-level:1"><a name="_____replyseparator"></a><b><span style="mso-fareast-language:ZH-CN">From:</span></b><span style="mso-fareast-language:ZH-CN">
<a href="mailto:devel@edk2.groups.io">devel@edk2.groups.io</a> <<a href="mailto:devel@edk2.groups.io">devel@edk2.groups.io</a>>
<b>On Behalf Of </b>Yao, Jiewen<br>
<b>Sent:</b> Tuesday, February 4, 2020 10:54 AM<br>
<b>To:</b> Kinney, Michael D <<a href="mailto:michael.d.kinney@intel.com">michael.d.kinney@intel.com</a>>;
<a href="mailto:devel@edk2.groups.io">devel@edk2.groups.io</a><br>
<b>Cc:</b> Sukerkar, Amol N <<a href="mailto:amol.n.sukerkar@intel.com">amol.n.sukerkar@intel.com</a>>; Wang, Jian J <<a href="mailto:jian.j.wang@intel.com">jian.j.wang@intel.com</a>><br>
<b>Subject:</b> Re: [edk2-devel] [Patch v10 2/2] CryptoPkg/BaseHashApiLib: Implement Unified Hash Calculation API<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:black;mso-fareast-language:ZH-CN">Thanks Mike, to cover us during Chinese New Year holiday.</span><span style="mso-fareast-language:ZH-CN"><br>
<br>
<span style="color:black">I am just back from vocation. A minor comment:</span><br>
<br>
<span style="color:black">The PcdHashApiLibPolicy is UINT8, but the value is shown as 32bit 0x00000004.</span><br>
<br>
<span style="color:black">There are couple of ways to enhance:</span><br>
<span style="color:black">1) Define UINT8, and use 8bit style 0x04.</span><br>
<span style="color:black">2) Define UINT32, and use 32bit style 0x00000004.</span><br>
<span style="color:black">3) Define UINT16 (match TCG definition), and use TCG defined value. (Tpm20.h)</span><br>
<span style="color:black">#define TPM_ALG_SHA1           (TPM_ALG_ID)(0x0004)</span><br>
<span style="color:black">#define TPM_ALG_SHA256         (TPM_ALG_ID)(0x000B)</span><br>
<span style="color:black">#define TPM_ALG_SHA384         (TPM_ALG_ID)(0x000C)</span><br>
<span style="color:black">#define TPM_ALG_SHA512         (TPM_ALG_ID)(0x000D)</span><br>
<span style="color:black">#define TPM_ALG_SM3_256        (TPM_ALG_ID)(0x0012)</span><br>
<br>
<span style="color:black">MD4 and MD5 are known as insecure and deprecated. I doubt if we want to add such support. (I strong recommend NO).</span><br>
<br>
<span style="color:black">If we can remove MD4 and MD5, I think we can use #3.</span><br>
<br>
<span style="color:black">Thank you</span><br>
<span style="color:black">Yao Jiewen</span><br>
<br>
<span style="color:purple">> -----Original Message-----</span><br>
<span style="color:purple">> From: Kinney, Michael D <<a href="mailto:michael.d.kinney@intel.com">michael.d.kinney@intel.com</a>></span><br>
<span style="color:purple">> Sent: Tuesday, February 4, 2020 7:36 AM</span><br>
<span style="color:purple">> To: <a href="mailto:devel@edk2.groups.io">devel@edk2.groups.io</a></span><br>
<span style="color:purple">> Cc: Sukerkar, Amol N <<a href="mailto:amol.n.sukerkar@intel.com">amol.n.sukerkar@intel.com</a>>; Yao, Jiewen</span><br>
<span style="color:purple">> <<a href="mailto:jiewen.yao@intel.com">jiewen.yao@intel.com</a>>; Wang, Jian J <<a href="mailto:jian.j.wang@intel.com">jian.j.wang@intel.com</a>></span><br>
<span style="color:purple">> Subject: [Patch v10 2/2] CryptoPkg/BaseHashApiLib: Implement Unified Hash</span><br>
<span style="color:purple">> Calculation API</span><br>
<span style="color:purple">> </span><br>
<span style="color:purple">> From: Amol N Sukerkar <<a href="mailto:amol.n.sukerkar@intel.com">amol.n.sukerkar@intel.com</a>></span><br>
<span style="color:purple">> </span><br>
<span style="color:purple">> <a href="https://bugzilla.tianocore.org/show_bug.cgi?id=2151">https://bugzilla.tianocore.org/show_bug.cgi?id=2151</a></span><br>
<span style="color:purple">> </span><br>
<span style="color:purple">> This commit introduces a Unified Hash API to calculate hash using a</span><br>
<span style="color:purple">> hashing algorithm specified by the PCD, PcdHashApiLibPolicy. This library</span><br>
<span style="color:purple">> interfaces with the various hashing API, such as, MD4, MD5, SHA1, SHA256,</span><br>
<span style="color:purple">> SHA512 and SM3_256 implemented in BaseCryptLib. The user can calculate</span><br>
<span style="color:purple">> the desired hash by setting PcdHashApiLibPolicy to appropriate value.</span><br>
<span style="color:purple">> </span><br>
<span style="color:purple">> This feature is documented in the Bugzilla,</span><br>
<span style="color:purple">> <a href="https://bugzilla.tianocore.org/show_bug.cgi?id=2151">https://bugzilla.tianocore.org/show_bug.cgi?id=2151</a>.</span><br>
<span style="color:purple">> </span><br>
<span style="color:purple">> Cc: Jiewen Yao <<a href="mailto:jiewen.yao@intel.com">jiewen.yao@intel.com</a>></span><br>
<span style="color:purple">> Cc: Jian J Wang <<a href="mailto:jian.j.wang@intel.com">jian.j.wang@intel.com</a>></span><br>
<span style="color:purple">> Cc: Michael D Kinney <<a href="mailto:michael.d.kinney@intel.com">michael.d.kinney@intel.com</a>></span><br>
<span style="color:purple">> Signed-off-by: Amol N Sukerkar <<a href="mailto:amol.n.sukerkar@intel.com">amol.n.sukerkar@intel.com</a>></span><br>
<span style="color:purple">> Reviewed-by: Michael D Kinney <<a href="mailto:michael.d.kinney@intel.com">michael.d.kinney@intel.com</a>></span><br>
<span style="color:purple">> ---</span><br>
<span style="color:purple">>  CryptoPkg/CryptoPkg.dec                       |  20 ++</span><br>
<span style="color:purple">>  CryptoPkg/CryptoPkg.dsc                       |   4 +-</span><br>
<span style="color:purple">>  CryptoPkg/CryptoPkg.uni                       |  18 +-</span><br>
<span style="color:purple">>  CryptoPkg/Include/Library/HashApiLib.h        | 122 +++++++</span><br>
<span style="color:purple">>  .../Library/BaseHashApiLib/BaseHashApiLib.c   | 330 ++++++++++++++++++</span><br>
<span style="color:purple">>  .../Library/BaseHashApiLib/BaseHashApiLib.inf |  44 +++</span><br>
<span style="color:purple">>  .../Library/BaseHashApiLib/BaseHashApiLib.uni |  17 +</span><br>
<span style="color:purple">>  7 files changed, 553 insertions(+), 2 deletions(-)</span><br>
<span style="color:purple">>  create mode 100644 CryptoPkg/Include/Library/HashApiLib.h</span><br>
<span style="color:purple">>  create mode 100644 CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.c</span><br>
<span style="color:purple">>  create mode 100644 CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.inf</span><br>
<span style="color:purple">>  create mode 100644 CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.uni</span><br>
<span style="color:purple">> </span><br>
<span style="color:purple">> diff --git a/CryptoPkg/CryptoPkg.dec b/CryptoPkg/CryptoPkg.dec</span><br>
<span style="color:purple">> index 41af6e879e..8ad0fb5d61 100644</span><br>
<span style="color:purple">> --- a/CryptoPkg/CryptoPkg.dec</span><br>
<span style="color:purple">> +++ b/CryptoPkg/CryptoPkg.dec</span><br>
<span style="color:purple">> @@ -33,9 +33,29 @@ [LibraryClasses]</span><br>
<span style="color:purple">>    ##</span><br>
<span style="color:purple">>    TlsLib|Include/Library/TlsLib.h</span><br>
<span style="color:purple">> </span><br>
<span style="color:purple">> +  ##  @libraryclass  Provides Unified API for different hash implementations.</span><br>
<span style="color:purple">> +  #</span><br>
<span style="color:purple">> +  HashApiLib|Include/Library/HashApiLib.h</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">>  [Guids]</span><br>
<span style="color:purple">>    ## Crypto package token space guid.</span><br>
<span style="color:purple">>    gEfiCryptoPkgTokenSpaceGuid      = { 0x6bd7de60, 0x9ef7, 0x4899, { 0x97,</span><br>
<span style="color:purple">> 0xd0, 0xab, 0xff, 0xfd, 0xe9, 0x70, 0xf2 } }</span><br>
<span style="color:purple">> </span><br>
<span style="color:purple">> +[PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]</span><br>
<span style="color:purple">> +  ## This PCD indicates the HASH algorithm to calculate hash of data</span><br>
<span style="color:purple">> +  #  Based on the value set, the required algorithm is chosen to calculate</span><br>
<span style="color:purple">> +  #  the hash of data.<BR></span><br>
<span style="color:purple">> +  #  The default hashing algorithm for BaseHashApiLib is set to SHA256.<BR></span><br>
<span style="color:purple">> +  #     0x00000001    - MD4.<BR></span><br>
<span style="color:purple">> +  #     0x00000002    - MD5.<BR></span><br>
<span style="color:purple">> +  #     0x00000003    - SHA1.<BR></span><br>
<span style="color:purple">> +  #     0x00000004    - SHA256.<BR></span><br>
<span style="color:purple">> +  #     0x00000005    - SHA384.<BR></span><br>
<span style="color:purple">> +  #     0x00000006    - SHA512.<BR></span><br>
<span style="color:purple">> +  #     0x00000007    - SM3_256.<BR></span><br>
<span style="color:purple">> +  # @Prompt Set policy for hashing unsigned image for Secure Boot.</span><br>
<span style="color:purple">> +  # @ValidRange 0x80000001 | 0x00000001 - 0x00000007</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> gEfiCryptoPkgTokenSpaceGuid.PcdHashApiLibPolicy|0x04|UINT8|0x00000001</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">>  [UserExtensions.TianoCore."ExtraFiles"]</span><br>
<span style="color:purple">>    CryptoPkgExtra.uni</span><br>
<span style="color:purple">> diff --git a/CryptoPkg/CryptoPkg.dsc b/CryptoPkg/CryptoPkg.dsc</span><br>
<span style="color:purple">> index ec43c1f0a4..9656a73b3c 100644</span><br>
<span style="color:purple">> --- a/CryptoPkg/CryptoPkg.dsc</span><br>
<span style="color:purple">> +++ b/CryptoPkg/CryptoPkg.dsc</span><br>
<span style="color:purple">> @@ -1,7 +1,7 @@</span><br>
<span style="color:purple">>  ## @file</span><br>
<span style="color:purple">>  #  Cryptographic Library Package for UEFI Security Implementation.</span><br>
<span style="color:purple">>  #</span><br>
<span style="color:purple">> -#  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR></span><br>
<span style="color:purple">> +#  Copyright (c) 2009 - 2020, Intel Corporation. All rights reserved.<BR></span><br>
<span style="color:purple">>  #  SPDX-License-Identifier: BSD-2-Clause-Patent</span><br>
<span style="color:purple">>  #</span><br>
<span style="color:purple">>  ##</span><br>
<span style="color:purple">> @@ -44,6 +44,7 @@ [LibraryClasses]</span><br>
<span style="color:purple">> </span><br>
<span style="color:purple">>    IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf</span><br>
<span style="color:purple">>    OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf</span><br>
<span style="color:purple">> +  HashApiLib|CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.inf</span><br>
<span style="color:purple">> </span><br>
<span style="color:purple">>  [LibraryClasses.ARM, LibraryClasses.AARCH64]</span><br>
<span style="color:purple">>    #</span><br>
<span style="color:purple">> @@ -120,6 +121,7 @@ [Components]</span><br>
<span style="color:purple">>    CryptoPkg/Library/TlsLibNull/TlsLibNull.inf</span><br>
<span style="color:purple">>    CryptoPkg/Library/OpensslLib/OpensslLib.inf</span><br>
<span style="color:purple">>    CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf</span><br>
<span style="color:purple">> +  CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.inf</span><br>
<span style="color:purple">> </span><br>
<span style="color:purple">>  [Components.IA32, Components.X64]</span><br>
<span style="color:purple">>    CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf</span><br>
<span style="color:purple">> diff --git a/CryptoPkg/CryptoPkg.uni b/CryptoPkg/CryptoPkg.uni</span><br>
<span style="color:purple">> index beb0036ef5..0dae4c4045 100644</span><br>
<span style="color:purple">> --- a/CryptoPkg/CryptoPkg.uni</span><br>
<span style="color:purple">> +++ b/CryptoPkg/CryptoPkg.uni</span><br>
<span style="color:purple">> @@ -4,7 +4,7 @@</span><br>
<span style="color:purple">>  // This Package provides cryptographic-related libraries for UEFI security</span><br>
<span style="color:purple">> modules.</span><br>
<span style="color:purple">>  // It also provides a test application to test libraries.</span><br>
<span style="color:purple">>  //</span><br>
<span style="color:purple">> -// Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR></span><br>
<span style="color:purple">> +// Copyright (c) 2009 - 2020, Intel Corporation. All rights reserved.<BR></span><br>
<span style="color:purple">>  //</span><br>
<span style="color:purple">>  // SPDX-License-Identifier: BSD-2-Clause-Patent</span><br>
<span style="color:purple">>  //</span><br>
<span style="color:purple">> @@ -17,3 +17,19 @@</span><br>
<span style="color:purple">> </span><br>
<span style="color:purple">> </span><br>
<span style="color:purple">> </span><br>
<span style="color:purple">> +#string STR_gEfiCryptoPkgTokenSpaceGuid_PcdHashApiLibPolicy_PROMPT</span><br>
<span style="color:purple">> #language en-US "HASH algorithm to calculate hash"</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +#string STR_gEfiCryptoPkgTokenSpaceGuid_PcdHashApiLibPolicy_HELP</span><br>
<span style="color:purple">> #language en-US "This PCD indicates the HASH algorithm to calculate hash of</span><br>
<span style="color:purple">> data.<BR><BR>\n"</span><br>
<span style="color:purple">> +                                                                                        "Based on the value set, the</span><br>
<span style="color:purple">> required algorithm is chosen to calculate\n"</span><br>
<span style="color:purple">> +                                                                                        "the hash of data.<BR>\n"</span><br>
<span style="color:purple">> +                                                                                        "The default hashing algorithm</span><br>
<span style="color:purple">> for BaseHashApiLib is set to SHA256.<BR>\n"</span><br>
<span style="color:purple">> +                                                                                        "0x00000001  -  MD4.<BR>\n"</span><br>
<span style="color:purple">> +                                                                                        "0x00000002  -  MD5.<BR>\n"</span><br>
<span style="color:purple">> +                                                                                        "0x00000003  -  SHA1.<BR>\n"</span><br>
<span style="color:purple">> +                                                                                        "0x00000004  -</span><br>
<span style="color:purple">> SHA256.<BR>\n"</span><br>
<span style="color:purple">> +                                                                                        "0x00000005  -</span><br>
<span style="color:purple">> SHA384.<BR>\n"</span><br>
<span style="color:purple">> +                                                                                        "0x00000006  -</span><br>
<span style="color:purple">> SHA512.<BR>\n"</span><br>
<span style="color:purple">> +                                                                                        "0x00000007  -  SM3.<BR>"</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> diff --git a/CryptoPkg/Include/Library/HashApiLib.h</span><br>
<span style="color:purple">> b/CryptoPkg/Include/Library/HashApiLib.h</span><br>
<span style="color:purple">> new file mode 100644</span><br>
<span style="color:purple">> index 0000000000..22068e5a17</span><br>
<span style="color:purple">> --- /dev/null</span><br>
<span style="color:purple">> +++ b/CryptoPkg/Include/Library/HashApiLib.h</span><br>
<span style="color:purple">> @@ -0,0 +1,122 @@</span><br>
<span style="color:purple">> +/** @file</span><br>
<span style="color:purple">> +  Unified Hash API Defines</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  This API when called will calculate the Hash using the</span><br>
<span style="color:purple">> +  hashing algorithm specified by PcdHashApiLibPolicy.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR></span><br>
<span style="color:purple">> +  SPDX-License-Identifier: BSD-2-Clause-Patent</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +**/</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +#ifndef __BASEHASHAPILIB_H_</span><br>
<span style="color:purple">> +#define __BASEHASHAPILIB_H_</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +typedef VOID  *HASH_API_CONTEXT;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +//</span><br>
<span style="color:purple">> +// Hash Algorithms</span><br>
<span style="color:purple">> +//</span><br>
<span style="color:purple">> +#define HASH_API_ALGO_INVALID    0x00000000</span><br>
<span style="color:purple">> +#define HASH_API_ALGO_MD4        0x00000001</span><br>
<span style="color:purple">> +#define HASH_API_ALGO_MD5        0x00000002</span><br>
<span style="color:purple">> +#define HASH_API_ALGO_SHA1       0x00000003</span><br>
<span style="color:purple">> +#define HASH_API_ALGO_SHA256     0x00000004</span><br>
<span style="color:purple">> +#define HASH_API_ALGO_SHA384     0x00000005</span><br>
<span style="color:purple">> +#define HASH_API_ALGO_SHA512     0x00000006</span><br>
<span style="color:purple">> +#define HASH_API_ALGO_SM3_256    0x00000007</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +/**</span><br>
<span style="color:purple">> +  Retrieves the size, in bytes, of the context buffer required for hash operations.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @return  The size, in bytes, of the context buffer required for hash operations.</span><br>
<span style="color:purple">> +**/</span><br>
<span style="color:purple">> +UINTN</span><br>
<span style="color:purple">> +EFIAPI</span><br>
<span style="color:purple">> +HashApiGetContextSize (</span><br>
<span style="color:purple">> +  VOID</span><br>
<span style="color:purple">> +  );</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +/**</span><br>
<span style="color:purple">> +  Init hash sequence.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @param[out] HashContext   Hash context.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @retval TRUE         Hash start and HashHandle returned.</span><br>
<span style="color:purple">> +  @retval FALSE        Hash Init unsuccessful.</span><br>
<span style="color:purple">> +**/</span><br>
<span style="color:purple">> +BOOLEAN</span><br>
<span style="color:purple">> +EFIAPI</span><br>
<span style="color:purple">> +HashApiInit (</span><br>
<span style="color:purple">> +  OUT HASH_API_CONTEXT  HashContext</span><br>
<span style="color:purple">> +  );</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +/**</span><br>
<span style="color:purple">> +  Makes a copy of an existing hash context.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @param[in]  HashContext     Hash context.</span><br>
<span style="color:purple">> +  @param[out] NewHashContext  New copy of hash context.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @retval TRUE         Hash context copy succeeded.</span><br>
<span style="color:purple">> +  @retval FALSE        Hash context copy failed.</span><br>
<span style="color:purple">> +**/</span><br>
<span style="color:purple">> +BOOLEAN</span><br>
<span style="color:purple">> +EFIAPI</span><br>
<span style="color:purple">> +HashApiDuplicate (</span><br>
<span style="color:purple">> +  IN  HASH_API_CONTEXT  HashContext,</span><br>
<span style="color:purple">> +  OUT HASH_API_CONTEXT  NewHashContext</span><br>
<span style="color:purple">> +  );</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +/**</span><br>
<span style="color:purple">> +  Update hash data.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @param[in] HashContext   Hash context.</span><br>
<span style="color:purple">> +  @param[in] DataToHash    Data to be hashed.</span><br>
<span style="color:purple">> +  @param[in] DataToHashLen Data size.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @retval TRUE         Hash updated.</span><br>
<span style="color:purple">> +  @retval FALSE        Hash updated unsuccessful.</span><br>
<span style="color:purple">> +**/</span><br>
<span style="color:purple">> +BOOLEAN</span><br>
<span style="color:purple">> +EFIAPI</span><br>
<span style="color:purple">> +HashApiUpdate (</span><br>
<span style="color:purple">> +  IN HASH_API_CONTEXT  HashContext,</span><br>
<span style="color:purple">> +  IN VOID              *DataToHash,</span><br>
<span style="color:purple">> +  IN UINTN             DataToHashLen</span><br>
<span style="color:purple">> +  );</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +/**</span><br>
<span style="color:purple">> +  Hash complete.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @param[in]  HashContext  Hash context.</span><br>
<span style="color:purple">> +  @param[out] Digest       Hash Digest.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @retval TRUE         Hash complete and Digest is returned.</span><br>
<span style="color:purple">> +  @retval FALSE        Hash complete unsuccessful.</span><br>
<span style="color:purple">> +**/</span><br>
<span style="color:purple">> +BOOLEAN</span><br>
<span style="color:purple">> +EFIAPI</span><br>
<span style="color:purple">> +HashApiFinal (</span><br>
<span style="color:purple">> +  IN  HASH_API_CONTEXT  HashContext,</span><br>
<span style="color:purple">> +  OUT UINT8             *Digest</span><br>
<span style="color:purple">> +  );</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +/**</span><br>
<span style="color:purple">> +  Computes hash message digest of a input data buffer.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @param[in]  DataToHash     Data to be hashed.</span><br>
<span style="color:purple">> +  @param[in]  DataToHashLen  Data size.</span><br>
<span style="color:purple">> +  @param[out] Digest         Hash Digest.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @retval TRUE   Hash digest computation succeeded.</span><br>
<span style="color:purple">> +  @retval FALSE  Hash digest computation failed.</span><br>
<span style="color:purple">> +**/</span><br>
<span style="color:purple">> +BOOLEAN</span><br>
<span style="color:purple">> +EFIAPI</span><br>
<span style="color:purple">> +HashApiHashAll (</span><br>
<span style="color:purple">> +  IN  CONST VOID  *DataToHash,</span><br>
<span style="color:purple">> +  IN  UINTN       DataToHashLen,</span><br>
<span style="color:purple">> +  OUT UINT8       *Digest</span><br>
<span style="color:purple">> +  );</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +#endif</span><br>
<span style="color:purple">> diff --git a/CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.c</span><br>
<span style="color:purple">> b/CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.c</span><br>
<span style="color:purple">> new file mode 100644</span><br>
<span style="color:purple">> index 0000000000..277ef9f0b4</span><br>
<span style="color:purple">> --- /dev/null</span><br>
<span style="color:purple">> +++ b/CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.c</span><br>
<span style="color:purple">> @@ -0,0 +1,330 @@</span><br>
<span style="color:purple">> +/** @file</span><br>
<span style="color:purple">> +  Unified Hash API Implementation</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  This file implements the Unified Hash API.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  This API, when called, will calculate the Hash using the</span><br>
<span style="color:purple">> +  hashing algorithm specified by PcdHashApiLibPolicy.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR></span><br>
<span style="color:purple">> +  SPDX-License-Identifier: BSD-2-Clause-Patent</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +**/</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +#include <Base.h></span><br>
<span style="color:purple">> +#include <Library/BaseLib.h></span><br>
<span style="color:purple">> +#include <Library/BaseMemoryLib.h></span><br>
<span style="color:purple">> +#include <Library/MemoryAllocationLib.h></span><br>
<span style="color:purple">> +#include <Library/BaseCryptLib.h></span><br>
<span style="color:purple">> +#include <Library/DebugLib.h></span><br>
<span style="color:purple">> +#include <Library/PcdLib.h></span><br>
<span style="color:purple">> +#include <Library/HashApiLib.h></span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +/**</span><br>
<span style="color:purple">> +  Retrieves the size, in bytes, of the context buffer required for hash operations.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @return  The size, in bytes, of the context buffer required for hash operations.</span><br>
<span style="color:purple">> +**/</span><br>
<span style="color:purple">> +UINTN</span><br>
<span style="color:purple">> +EFIAPI</span><br>
<span style="color:purple">> +HashApiGetContextSize (</span><br>
<span style="color:purple">> +  VOID</span><br>
<span style="color:purple">> +  )</span><br>
<span style="color:purple">> +{</span><br>
<span style="color:purple">> +  switch (PcdGet8 (PcdHashApiLibPolicy)) {</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_MD4:</span><br>
<span style="color:purple">> +      return Md4GetContextSize ();</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_MD5:</span><br>
<span style="color:purple">> +      return Md5GetContextSize ();</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA1:</span><br>
<span style="color:purple">> +      return Sha1GetContextSize ();</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA256:</span><br>
<span style="color:purple">> +      return Sha256GetContextSize ();</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA384:</span><br>
<span style="color:purple">> +      return Sha384GetContextSize ();</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA512:</span><br>
<span style="color:purple">> +      return Sha512GetContextSize ();</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SM3_256:</span><br>
<span style="color:purple">> +      return Sm3GetContextSize ();</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    default:</span><br>
<span style="color:purple">> +      ASSERT (FALSE);</span><br>
<span style="color:purple">> +      return 0;</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +  }</span><br>
<span style="color:purple">> +}</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +/**</span><br>
<span style="color:purple">> +  Init hash sequence.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @param[out] HashContext   Hash context.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @retval TRUE         Hash start and HashHandle returned.</span><br>
<span style="color:purple">> +  @retval FALSE        Hash Init unsuccessful.</span><br>
<span style="color:purple">> +**/</span><br>
<span style="color:purple">> +BOOLEAN</span><br>
<span style="color:purple">> +EFIAPI</span><br>
<span style="color:purple">> +HashApiInit (</span><br>
<span style="color:purple">> +  OUT HASH_API_CONTEXT  HashContext</span><br>
<span style="color:purple">> +  )</span><br>
<span style="color:purple">> +{</span><br>
<span style="color:purple">> +  switch (PcdGet8 (PcdHashApiLibPolicy)) {</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_MD4:</span><br>
<span style="color:purple">> +      return Md4Init (HashContext);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_MD5:</span><br>
<span style="color:purple">> +      return Md5Init (HashContext);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA1:</span><br>
<span style="color:purple">> +      return Sha1Init (HashContext);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA256:</span><br>
<span style="color:purple">> +      return Sha256Init (HashContext);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA384:</span><br>
<span style="color:purple">> +      return Sha384Init (HashContext);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA512:</span><br>
<span style="color:purple">> +      return Sha512Init (HashContext);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SM3_256:</span><br>
<span style="color:purple">> +      return Sm3Init (HashContext);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    default:</span><br>
<span style="color:purple">> +      ASSERT (FALSE);</span><br>
<span style="color:purple">> +      return FALSE;</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +  }</span><br>
<span style="color:purple">> +}</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +/**</span><br>
<span style="color:purple">> +  Makes a copy of an existing hash context.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @param[in]  HashContext     Hash context.</span><br>
<span style="color:purple">> +  @param[out] NewHashContext  New copy of hash context.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @retval TRUE         Hash context copy succeeded.</span><br>
<span style="color:purple">> +  @retval FALSE        Hash context copy failed.</span><br>
<span style="color:purple">> +**/</span><br>
<span style="color:purple">> +BOOLEAN</span><br>
<span style="color:purple">> +EFIAPI</span><br>
<span style="color:purple">> +HashApiDuplicate (</span><br>
<span style="color:purple">> +  IN  HASH_API_CONTEXT  HashContext,</span><br>
<span style="color:purple">> +  OUT HASH_API_CONTEXT  NewHashContext</span><br>
<span style="color:purple">> +  )</span><br>
<span style="color:purple">> +{</span><br>
<span style="color:purple">> +  switch (PcdGet8 (PcdHashApiLibPolicy)) {</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_MD4:</span><br>
<span style="color:purple">> +      return Md4Duplicate (HashContext, NewHashContext);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_MD5:</span><br>
<span style="color:purple">> +      return Md5Duplicate (HashContext, NewHashContext);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA1:</span><br>
<span style="color:purple">> +      return Sha1Duplicate (HashContext, NewHashContext);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA256:</span><br>
<span style="color:purple">> +      return Sha256Duplicate (HashContext, NewHashContext);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA384:</span><br>
<span style="color:purple">> +      return Sha384Duplicate (HashContext, NewHashContext);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA512:</span><br>
<span style="color:purple">> +      return Sha512Duplicate (HashContext, NewHashContext);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SM3_256:</span><br>
<span style="color:purple">> +      return Sm3Duplicate (HashContext, NewHashContext);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    default:</span><br>
<span style="color:purple">> +      ASSERT (FALSE);</span><br>
<span style="color:purple">> +      return FALSE;</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +  }</span><br>
<span style="color:purple">> +}</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +/**</span><br>
<span style="color:purple">> +  Update hash data.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @param[in] HashContext   Hash context.</span><br>
<span style="color:purple">> +  @param[in] DataToHash    Data to be hashed.</span><br>
<span style="color:purple">> +  @param[in] DataToHashLen Data size.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @retval TRUE         Hash updated.</span><br>
<span style="color:purple">> +  @retval FALSE        Hash updated unsuccessful.</span><br>
<span style="color:purple">> +**/</span><br>
<span style="color:purple">> +BOOLEAN</span><br>
<span style="color:purple">> +EFIAPI</span><br>
<span style="color:purple">> +HashApiUpdate (</span><br>
<span style="color:purple">> +  IN HASH_API_CONTEXT  HashContext,</span><br>
<span style="color:purple">> +  IN VOID              *DataToHash,</span><br>
<span style="color:purple">> +  IN UINTN             DataToHashLen</span><br>
<span style="color:purple">> +  )</span><br>
<span style="color:purple">> +{</span><br>
<span style="color:purple">> +  switch (PcdGet8 (PcdHashApiLibPolicy)) {</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_MD4:</span><br>
<span style="color:purple">> +      return Md4Update (HashContext, DataToHash, DataToHashLen);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_MD5:</span><br>
<span style="color:purple">> +      return Md5Update (HashContext, DataToHash, DataToHashLen);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA1:</span><br>
<span style="color:purple">> +      return Sha1Update (HashContext, DataToHash, DataToHashLen);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA256:</span><br>
<span style="color:purple">> +      return Sha256Update (HashContext, DataToHash, DataToHashLen);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA384:</span><br>
<span style="color:purple">> +      return Sha384Update (HashContext, DataToHash, DataToHashLen);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA512:</span><br>
<span style="color:purple">> +      return Sha512Update (HashContext, DataToHash, DataToHashLen);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SM3_256:</span><br>
<span style="color:purple">> +      return Sm3Update (HashContext, DataToHash, DataToHashLen);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    default:</span><br>
<span style="color:purple">> +      ASSERT (FALSE);</span><br>
<span style="color:purple">> +      return FALSE;</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +  }</span><br>
<span style="color:purple">> +}</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +/**</span><br>
<span style="color:purple">> +  Hash complete.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @param[in]  HashContext  Hash context.</span><br>
<span style="color:purple">> +  @param[out] Digest       Hash Digest.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @retval TRUE         Hash complete and Digest is returned.</span><br>
<span style="color:purple">> +  @retval FALSE        Hash complete unsuccessful.</span><br>
<span style="color:purple">> +**/</span><br>
<span style="color:purple">> +BOOLEAN</span><br>
<span style="color:purple">> +EFIAPI</span><br>
<span style="color:purple">> +HashApiFinal (</span><br>
<span style="color:purple">> +  IN  HASH_API_CONTEXT  HashContext,</span><br>
<span style="color:purple">> +  OUT UINT8             *Digest</span><br>
<span style="color:purple">> +  )</span><br>
<span style="color:purple">> +{</span><br>
<span style="color:purple">> +  switch (PcdGet8 (PcdHashApiLibPolicy)) {</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_MD4:</span><br>
<span style="color:purple">> +      return Md4Final (HashContext, Digest);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_MD5:</span><br>
<span style="color:purple">> +      return Md5Final (HashContext, Digest);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA1:</span><br>
<span style="color:purple">> +      return Sha1Final (HashContext, Digest);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA256:</span><br>
<span style="color:purple">> +      return Sha256Final (HashContext, Digest);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA384:</span><br>
<span style="color:purple">> +      return Sha384Final (HashContext, Digest);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA512:</span><br>
<span style="color:purple">> +      return Sha512Final (HashContext, Digest);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SM3_256:</span><br>
<span style="color:purple">> +      return Sm3Final (HashContext, Digest);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    default:</span><br>
<span style="color:purple">> +      ASSERT (FALSE);</span><br>
<span style="color:purple">> +      return FALSE;</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +  }</span><br>
<span style="color:purple">> +}</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +/**</span><br>
<span style="color:purple">> +  Computes hash message digest of a input data buffer.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @param[in]  DataToHash     Data to be hashed.</span><br>
<span style="color:purple">> +  @param[in]  DataToHashLen  Data size.</span><br>
<span style="color:purple">> +  @param[out] Digest         Hash Digest.</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +  @retval TRUE   Hash digest computation succeeded.</span><br>
<span style="color:purple">> +  @retval FALSE  Hash digest computation failed.</span><br>
<span style="color:purple">> +**/</span><br>
<span style="color:purple">> +BOOLEAN</span><br>
<span style="color:purple">> +EFIAPI</span><br>
<span style="color:purple">> +HashApiHashAll (</span><br>
<span style="color:purple">> +  IN  CONST VOID  *DataToHash,</span><br>
<span style="color:purple">> +  IN  UINTN       DataToHashLen,</span><br>
<span style="color:purple">> +  OUT UINT8       *Digest</span><br>
<span style="color:purple">> +  )</span><br>
<span style="color:purple">> +{</span><br>
<span style="color:purple">> +  switch (PcdGet8 (PcdHashApiLibPolicy)) {</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_MD4:</span><br>
<span style="color:purple">> +      return Md4HashAll (DataToHash, DataToHashLen, Digest);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_MD5:</span><br>
<span style="color:purple">> +      return Md5HashAll (DataToHash, DataToHashLen, Digest);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA1:</span><br>
<span style="color:purple">> +      return Sha1HashAll (DataToHash, DataToHashLen, Digest);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA256:</span><br>
<span style="color:purple">> +      return Sha256HashAll (DataToHash, DataToHashLen, Digest);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA384:</span><br>
<span style="color:purple">> +      return Sha384HashAll (DataToHash, DataToHashLen, Digest);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SHA512:</span><br>
<span style="color:purple">> +      return Sha512HashAll (DataToHash, DataToHashLen, Digest);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    case HASH_API_ALGO_SM3_256:</span><br>
<span style="color:purple">> +      return Sm3HashAll (DataToHash, DataToHashLen, Digest);</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +    default:</span><br>
<span style="color:purple">> +      ASSERT (FALSE);</span><br>
<span style="color:purple">> +      return FALSE;</span><br>
<span style="color:purple">> +      break;</span><br>
<span style="color:purple">> +  }</span><br>
<span style="color:purple">> +}</span><br>
<span style="color:purple">> diff --git a/CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.inf</span><br>
<span style="color:purple">> b/CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.inf</span><br>
<span style="color:purple">> new file mode 100644</span><br>
<span style="color:purple">> index 0000000000..b4d8675ddd</span><br>
<span style="color:purple">> --- /dev/null</span><br>
<span style="color:purple">> +++ b/CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.inf</span><br>
<span style="color:purple">> @@ -0,0 +1,44 @@</span><br>
<span style="color:purple">> +## @file</span><br>
<span style="color:purple">> +#  Provides Unified API for Hash Calculation</span><br>
<span style="color:purple">> +#</span><br>
<span style="color:purple">> +#  This library is BaseHashApiLib. It will redirect hash request to</span><br>
<span style="color:purple">> +#  each individual hash API, such as SHA1, SHA256, SHA384, SM3 based</span><br>
<span style="color:purple">> +#  on hashing algorithm specified by PcdHashApiLibPolicy.</span><br>
<span style="color:purple">> +#</span><br>
<span style="color:purple">> +# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR></span><br>
<span style="color:purple">> +# SPDX-License-Identifier: BSD-2-Clause-Patent</span><br>
<span style="color:purple">> +#</span><br>
<span style="color:purple">> +##</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +[Defines]</span><br>
<span style="color:purple">> +  INF_VERSION                    = 0x00010005</span><br>
<span style="color:purple">> +  BASE_NAME                      = BaseHashApiLib</span><br>
<span style="color:purple">> +  MODULE_UNI_FILE                = BaseHashApiLib.uni</span><br>
<span style="color:purple">> +  FILE_GUID                      = B1E566DD-DE7C-4F04-BDA0-B1295D3BE927</span><br>
<span style="color:purple">> +  MODULE_TYPE                    = BASE</span><br>
<span style="color:purple">> +  VERSION_STRING                 = 1.0</span><br>
<span style="color:purple">> +  LIBRARY_CLASS                  = BaseHashApiLib</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +#</span><br>
<span style="color:purple">> +# The following information is for reference only and not required by the build</span><br>
<span style="color:purple">> tools.</span><br>
<span style="color:purple">> +#</span><br>
<span style="color:purple">> +#  VALID_ARCHITECTURES           = IA32 X64</span><br>
<span style="color:purple">> +#</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +[Sources]</span><br>
<span style="color:purple">> +  BaseHashApiLib.c</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +[Packages]</span><br>
<span style="color:purple">> +  MdePkg/MdePkg.dec</span><br>
<span style="color:purple">> +  CryptoPkg/CryptoPkg.dec</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +[LibraryClasses]</span><br>
<span style="color:purple">> +  BaseLib</span><br>
<span style="color:purple">> +  BaseMemoryLib</span><br>
<span style="color:purple">> +  DebugLib</span><br>
<span style="color:purple">> +  MemoryAllocationLib</span><br>
<span style="color:purple">> +  BaseCryptLib</span><br>
<span style="color:purple">> +  PcdLib</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +[Pcd]</span><br>
<span style="color:purple">> +  gEfiCryptoPkgTokenSpaceGuid.PcdHashApiLibPolicy    ## CONSUMES</span><br>
<span style="color:purple">> diff --git a/CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.uni</span><br>
<span style="color:purple">> b/CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.uni</span><br>
<span style="color:purple">> new file mode 100644</span><br>
<span style="color:purple">> index 0000000000..49ba82e86f</span><br>
<span style="color:purple">> --- /dev/null</span><br>
<span style="color:purple">> +++ b/CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.uni</span><br>
<span style="color:purple">> @@ -0,0 +1,17 @@</span><br>
<span style="color:purple">> +// /** @file</span><br>
<span style="color:purple">> +// Provides Unified API for Hash Calculation</span><br>
<span style="color:purple">> +//</span><br>
<span style="color:purple">> +// This library is BaseHashApiLib. It will redirect hash request to</span><br>
<span style="color:purple">> +// each individual hash API, such as SHA1, SHA256, SHA384, SM3 based</span><br>
<span style="color:purple">> +// on hashing algorithm specified by PcdHashApiLibPolicy.</span><br>
<span style="color:purple">> +//</span><br>
<span style="color:purple">> +// Copyright (c) 2020, Intel Corporation. All rights reserved.<BR></span><br>
<span style="color:purple">> +//</span><br>
<span style="color:purple">> +// SPDX-License-Identifier: BSD-2-Clause-Patent</span><br>
<span style="color:purple">> +//</span><br>
<span style="color:purple">> +// **/</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +#string STR_MODULE_ABSTRACT             #language en-US "Provides hash</span><br>
<span style="color:purple">> service by specified hash handler"</span><br>
<span style="color:purple">> +</span><br>
<span style="color:purple">> +#string STR_MODULE_DESCRIPTION          #language en-US "This library is</span><br>
<span style="color:purple">> Unified Hash API. It will redirect hash request to the hash handler specified by</span><br>
<span style="color:purple">> PcdHashApiLibPolicy."</span><br>
<span style="color:purple">> --</span><br>
<span style="color:purple">> 2.21.0.windows.1</span><br>
<br>
<br>
<span style="color:black"></span><o:p></o:p></span></p>
</div>
</div>
</body>
</html>

<div width="1" style="color:white;clear:both">_._,_._,_</div>
<hr>
Groups.io Links:<p>


You receive all messages sent to this group.



<p>

<a target="_blank" href="https://edk2.groups.io/g/devel/message/53733">View/Reply Online (#53733)</a> |


  


|


  
    <a target="_blank" href="https://groups.io/mt/70960524/1813853">Mute This Topic</a>
  

| <a href="https://edk2.groups.io/g/devel/post">New Topic</a><br>



<br>

<a href="https://edk2.groups.io/g/devel/editsub/1813853">Your Subscription</a> |
<a href="mailto:devel+owner@edk2.groups.io">Contact Group Owner</a> |

<a href="https://edk2.groups.io/g/devel/unsub">Unsubscribe</a>

 [edk2-devel-archive@redhat.com]<br>
<div width="1" style="color:white;clear:both">_._,_._,_</div>