チュートリアル 5716

低コストで高いセキュリティ効果を実現するハードウェアセキュリティIC

筆者: Christophe Tremlet

要約: 医療および安全性に関するアプリケーションのセキュリティの脆弱性に対して、各国政府と業界の主要企業は電子デバイスの設計と保護におけるセキュリティ上の弱点を重視しています。この記事では、ハードウェアセキュリティICの使用によって、低コストかつ設計に対する影響を最小限に抑えながら、生命に関わる機器、周辺装置、およびコンピュータシステムに対する不正なアクセスのリスクを大幅に低減することを説明します。

重要なシステムの攻撃に対する脆弱性から、強化されたセキュリティ方式の必要性に対する意識が高まっています。業界では主としてソフトウェアに基づくサイバーセキュリティ方式が使用されてきましたが、ハードウェアに基づく方式は強力な保護を実現し、コスト増に十分見合う信頼の基盤を提供するという独自の能力を備えているため、急速に注目を集めています。コスト効率に優れたシリコンソリューションの出現によって、設計者は設計を堅牢化し、全体的コストへの影響を最小限に抑えながら、エンベデッドデバイス、周辺装置、およびシステムに対する不正アクセスのリスクを大幅に低減することができます。
次のような例を考えてみます。
心臓病患者が自宅で快適に休息を取っており、最新式のワイヤレスペースメーカーが安定したパルスのストリームを提供し、同期的な心筋収縮を確保します。彼の知らないうちに、オポチュニスティック型ハッカーのチームが彼のペースメーカーシステムのIPアドレスに遭遇し、各種の侵入ツールを発動させます。ペースメーカーは、それぞれの攻撃を無効化する何層ものセキュリティに保護されているため、規定の信号を供給し続け、やがてハッカーはあきらめて、もっと容易な標的を求めてスキャンを続行します。患者はハッキングの試みにまったく気づかず、安らかに休息を取り続けます。
このシナリオは想像上のものですが、実際に発生する可能性が十分にあります。実際に、医療機器の脆弱性に関する最近のFDAの警告では、ネットワーク接続されたあらゆる医療機器に安全な基盤を提供することができる、信頼性のあるシステムの必要性を非常に強調しています。最近の電子的に制御された自動車やワイヤレス対応の交通システムにさえ同様の弱点があることが報告されており、健康と安全にとって非常に重要なシステムが悪人に対する脆弱性を持つことは明らかです。逆説的に、サイバー攻撃が成功した場合に発生する健康と安全への重大な影響の可能性を考えると、妥当なレベルの信頼とセキュリティを内蔵するコストはわずかなものです。
数十年にわたって、信頼性のあるシステムプロトコル(コンピュータシステムやビルなど)は、権限のあるユーザー、ソフトウェアプロセス、またはその他のハードウェア機器のみにアクセスを限定するように設計された多層のリソース保護を使用してきました。アクセスを許可するには、保護対象のリソースが要求元エンティティのIDを認証(または検証)する必要があります。
セキュアな施設にアクセスするための認証方式には複数の認証要素(アクセスカード、アクセスコード、および生体測定を含む)が使用されるのに対して、各コンピュータシステムや機器にアクセスするための認証方式は遅れています。現在でも、コンピュータシステムのセキュリティは主として単純なIDとパスワードに依存しています。しかし、IDとパスワードは破られる可能性があり、ウイルスや、一定期間にわたって潜在して機密資産を盗み出すより狡猾なマルウェアにシステムを晒すことになります。
実際に、メーカーへの警告として、FDAは「無制限のパスワード配布、パスワードの無効化、特権的な機器アクセス用のソフトウェア(たとえば、システム管理、技術、および保守担当者が使用するもの)にハードコードされたパスワード」が原因で、弱いパスワードセキュリティが主要な脆弱性の1つになることを示しています1
確かに、何らかの面で健康と安全性に関係する機器には、コンピュータユーザーが(そしてコンピュータ攻撃者が)扱い慣れている従来のIDとパスワードよりも、はるかに強力な認証方式の実装が必要です。

効果的な認証

より効果的な認証方式として、ホストシステムがランダムなチャレンジを生成する方法があります。たとえば、標準的なチャレンジ(「あなたのパスワードは?」)の代わりに、一見ランダムな文字列をチャレンジに使用します。次に、要求元エンティティはメッセージ認証コード(MAC)を含む符号化されたレスポンスを送信します。MACは、要求元エンティティの内部データだけでなく、シークレットと、ホストから受信した特定のランダムチャレンジも含みアルゴリズムを使用して計算されます。その後、ホストは受信したMACレスポンスと予期されるレスポンスを比較し、相手が正当なエンティティかどうかを検証します(図1)。
図1. 効果的なチャレンジ&レスポンス認証方式では、ランダムチャレンジに基づいて有効なレスポンスを構築し、正当なアクセサリのIDを確認します。
図1. 効果的なチャレンジ&レスポンス認証方式では、ランダムチャレンジに基づいて有効なレスポンスを構築し、正当なアクセサリのIDを確認します。
このより堅牢なチャレンジ&レスポンス認証方式によって、たとえばワイヤレスペースメーカーは有効なMACを受信したかどうかを確かめ、通信相手が正当なホストであることを確認してからパルスレートを変更することができます。自動車、トラック、または重機の場合は、正当なMACを供給する信頼性のあるエンベデッドデバイスおよび周辺装置からのデータストリームを使用して車両の電子制御装置が明白な緊急事態に応答することができます。
過去において、企業がより良いセキュリティ対策を実装しようとする場合、スタンドアロンの暗号ユニットのような堅牢ではあるが高価なハードウェアを使用するか、ソフトウェアのみのソリューションの限界を受け入れるかの、二者択一を強いられました。高度なチャレンジ&レスポンス方式をソフトウェアで実装した場合、ホストプロセッサの負荷が大幅に増加し、セキュリティの応答性およびホストシステムの全体的性能が低下する可能性があります。これらの動作上の問題に加えて、ソフトウェア方式はあらゆるシステムセキュリティアーキテクチャにおいて弱いリンクのままになります。シークレットは通常のシステムメモリ内に保持されるため露見や改変に対して脆弱なままであり、アルゴリズム自体もより汎用的なハードウェア上で実行されるため、チャレンジの完全なランダム性のみならずそれらの浸透さえ確保することができません。この組み合わせは、悪人が利用に成功し続けているさまざまな技術的および社会的方法を介してアプリケーションを攻撃に晒す可能性があります。
セキュリティ方式を実装した専用のICは、ソフトウェアに基づくセキュリティと比べて複数の利点を提供します。専用の暗号チップは、計算量の多い暗号アルゴリズムを処理するための負荷をホストMCUから取り除きます。さらに、これらのセキュリティICは攻撃者の侵入ポイントを減少させ、鍵や共有シークレットを表す暗号パラメータなどのデータ用にセキュアなストレージを提供します。複数層の保護を使って機密の暗号データおよびアルゴリズムを保護することによって、これらのデバイスはソフトウェアに基づくセキュリティでは対処がより困難となるすべての脅威に対抗することができます。
より基本的なレベルで、セキュアシリコンは信頼のルート(根)の基盤を提供し、基底となるアルゴリズムとデータの基盤のセキュリティが維持されているという十分な確信を持ってエンジニアが上位レベルのアプリケーションを構築することを可能にします。実際に、後で検討するように、この信頼のルートをシリコンで作るには、結局シリコンデバイス自体のセキュリティ確保のみではなく、その出発点から始まる製造および流通チャネルのセキュリティ確保が必須です。

セキュアIC

マキシム・インテグレーテッドのDeepCover®セキュア認証用ICは、独自の物理セキュリティ機構を活用しています。これらの認証用デバイスは、高度物理セキュリティによって機密データを保護します。攻撃者は多層防御セキュリティを使用したデバイスに直面して、攻撃の成功に必要なコストと時間のしきい値が、侵入によって得られる価値を上回っていることを認識します。
同様に重要な点として、これらのハードウェアセキュリティICはインテグレーションを簡素化します。これらの低コストデバイスで使用される1-Wire®インタフェースは設計が簡素なため、幅広いアプリケーションで容易に使用することができます。標準的なアプリケーションの場合、エンジニアはプルアップ抵抗を追加してMCUの予備I/OポートをDS28E15などのDeepCover認証用デバイスに接続するだけです(図2)。
  販売代理店向け単価はございません 以下から見積もりをご請求ください: Model N "); $("#inventoryDetails").removeClass("col-sm-6"); $("#inventoryDetails").addClass("col-sm-12"); } else { var partNumber = encodeURIComponent(part_no); var htmlBulkOrder = "
" ; $("#buyQuantityDiv").html(htmlBulkOrder); } } } if( sampleJson.canQuote != true ) { $("#requestQuoteDiv").hide(); } if(sampleJson.leadTime == 0 && !(sampleJson.cf == "true" && sampleJson.carrierType == "Tape") ){ if($('#requestQuoteDiv').css('display') != "block") { $('#forLeadtime').removeClass('hidden'); } //$('#quantity5000').show(); } if(maxInventory == 0) { $("#stdleadTime").html('予想リードタイム'); } if(params == 'Quote'){ $('#rowDiv').addClass("hidden"); $("#quoteRow").removeClass("hidden"); $("#nonQuote").addClass("hidden"); } else { if(leadTime != "" && leadTime != "undefined" && (parseInt(leadTime) > 0 && parseInt(leadTime) < 98) || parseInt(leadTime) == 0 ){ }else { if(userType != "DISTRIBUTOR") { $('#rowDiv div:not("#inventoryDetails,#requestQuoteDiv, #requestQuoteDiv2")').hide(); if($(".requestQuoteFromBuyCart").css('display') == 'none'){ $("#contactSales").show(); } } } } $('#addToCartP').modal('show'); if (userType == "EMPLOYEE" ) { $(document).find('#qtytobuyText').hide(); $(document).find('#product-quantity').hide(); $(document).find('#addToCartButton').hide(); $(document).find('#employeeMsg').show(); } if(sampleJson.cf == "true" && sampleJson.carrierType == "Tape" && maxInventory == 0){ $("#priceBreak").remove(); $("#orderingquotetext").remove(); $("#quantity5000").remove(); $('#useExistingQuote').remove(); $('#borderid').remove(); $('#inventoryDetails').removeClass('col-sm-6'); $('#inventoryDetails').addClass('col-sm-12'); $('#inventoryDetails').css('padding-left', '55px'); $('#inventoryDetails').css('padding-right', '55px'); $("#sotPartswithnostock").html('大変申し訳ございません、在庫切れの為ご要望にお応えすることができません。このパッケージタイプはテストとテープ&リール一体型のテスターを使用している為、最終テスト完了時にリールサイズに満たない端数ロットが生じた場合にのみテープカット品として販売しております。現在はこの端数ロット在庫が売り切れの状態です。ご注文をテープ&リール品番(末尾が+Tまたは+T&R)へ切り替えてのご購入を検討いただくか、またはマキシム製品販売代理店に少数購入が可能かお問合せお願いいたします。'); } } } else { document.getElementById('buyParams').innerHTML = "Default"; digitalErrorFunction('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); bootbox.alert('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); } } }); var url = "/bin/checkQuoteAvailabilty?partNumber=" + encodeURIComponent(part_no) $.ajax({ url: url, dataType: "json", type: 'POST', async: false, xhrFields: { withCredentials: true }, success: function(data) { result = data; if(result != ""){ if(result.quoteList.quotes.quoteAvailable){ var quoteAvailable = result.quoteList.quotes.quoteAvailable; if(quoteAvailable == "true"){ $("#ortext").removeClass("hidden"); $('#useExistingQuote').show(); } } } } }); if (CQ_Analytics.PersonalInfoStoreMgr.getProperty("isLoggedIn") == "") { $.cookie("redirect","widget"); $.cookie("buy",buy); $.cookie("part_no",encodeURIComponent(part_no)); $.cookie("sampQty",sampQty); if(params == "ProductOrderTab"){ $.cookie("orderTab","true"); } } } else if (buy == "sample" && (CQ_Analytics.PersonalInfoStoreMgr.getProperty("isLoggedIn", true) || CQ_Analytics.PersonalInfoStoreMgr.getProperty("isLoggedIn", true) == "true")) { if(userType == "DISTRIBUTOR" || userType == "EMPLOYEE" ){ window.location.href = "https://shop.maximintegrated.com/backoffice/general/index.php?action=DISTRIBUTOR"; return false; } var userId = CQ_Analytics.ProfileDataMgr.getProperty("email"); var isSampleOrderAllowed = "true"; var sampleMessage = ""; var data = "userId="+userId; $.ajax({ type: "post", url: '/bin/validateSampleOrder', async: false, data: data, success: function(msg) { if(msg.error == "genericerrorText"){ digitalErrorFunction('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); bootbox.alert('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); } else if(msg.status == false){ if(msg.message.match("^Your session expired")){ bootbox.confirm('セッションが期限切れです。もう一度ログインしてください。', function(result) { var authorizableId = CQ_Analytics.PersonalInfoStoreMgr.getProperty("authorizableId"); CQ.shared.Util.load("\x2Fbin\x2FLogoutServlet\x3Flanguage\x3Den"+"&authorizableId="+authorizableId); window.location="/jp/mymaxim/login.html"; }); } else { digitalErrorFunction(msg.message); bootbox.alert(msg.message); } } else { isSampleOrderAllowed = msg.output.validateEmailDomain.isOrderAllowed; sampleMessage = msg.output.validateEmailDomain.message; var itemCount = msg.output.validateEmailDomain.itemCount; var orderCount = msg.output.validateEmailDomain.orderCount; if(localStorage.getItem(part_no) == 1) { mycart_widget("sample", function(status){ if(status && typeof _satellite != "undefined") _satellite.track("cart: add"); }); return false; } else { sampleAddToCart(isSampleOrderAllowed, sampQty, part_no, sampleMessage,itemCount,orderCount); } } } }); } else { $.cookie("redirect","widget"); $.cookie("buy",buy); $.cookie("part_no",encodeURIComponent(part_no)); $.cookie("sampQty",sampQty); if(params == "ProductOrderTab"){ $.cookie("orderTab","true"); } gigya.accounts.showScreenSet(aem.login.params); } } } function redirect_rochester(part_no){ var url = 'https://api.rocelec.com/parts/MAX/1?callback=callback&q='+ part_no +'&key=Z3kk1y*'; $.ajax({ type: 'GET', url: url, async: false, jsonpCallback: 'callback', contentType: "application/json", dataType: 'jsonp', success: function(json) { if(json.parts[0] != undefined){ if('permalink' in json.parts[0]){ window.open(json.parts[0].permalink,'_blank'); } else{ digitalErrorFunction('
Rochesterに現在この製品の在庫はございませんが、この製品の調達が可能か Rochester に問い合わせすることができます。もし調達ができない場合 マキシムのテクニカルアプリケーションエンジニアにお問い合わせ ください。置換品として使用可能な同様のデバイスについてアドバイスさせていただきます。
'); bootbox.alert('
Rochesterに現在この製品の在庫はございませんが、この製品の調達が可能か Rochester に問い合わせすることができます。もし調達ができない場合 マキシムのテクニカルアプリケーションエンジニアにお問い合わせ ください。置換品として使用可能な同様のデバイスについてアドバイスさせていただきます。
'); } } else{ if(typeof _satellite != "undefined"){ _satellite.track("rochester-popup"); } bootbox.alert('
Rochesterに現在この製品の在庫はございませんが、この製品の調達が可能か Rochester に問い合わせすることができます。もし調達ができない場合 マキシムのテクニカルアプリケーションエンジニアにお問い合わせ ください。置換品として使用可能な同様のデバイスについてアドバイスさせていただきます。
'); } }, error: function(e) { console.log(e.message); digitalErrorFunction(e.message); } }); } function getDistrbutorInventoryData(partNumber) { if(typeof partNumber != "undefined" && partNumber != "") { var distributors = {}; var distributor_template = Handlebars.compile($("#distributorData").html()); var data = "query="+encodeURIComponent(partNumber); $.ajax({ type: "post", url: '/bin/distributorInventoryComponent', async: true, data: data, success: function(data) { if(data.error == "genericerrorText"){ digitalErrorFunction('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); bootbox.alert('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); } else if(data != null || data != ""){ $('#distributor-loading-image').hide(); if(data != "") { var dataJSON = JSON.parse(data); dataJSON['code']=partNumber; $('#distributor-modal').html(distributor_template(dataJSON)); } } } }); } } function add_to_cart(part_no, buy, params, sampQty,quantity) { var userType = encodeURI(CQ_Analytics.PersonalInfoStoreMgr.getProperty("userType")); if(userType == "") { userType="anonymous"; } var userId = CQ_Analytics.ProfileDataMgr.getProperty("email"); if(params == 'Quote'){ $("#addToCartP").attr('data-quote-id', sampQty.quoteId); $("#addToCartP").attr('data-quote-item-number', sampQty.quoteItemNumber); } if (buy == "part") { var message = ""; var data = "userId="+userId; var isOrderAllowed="true"; $.ajax({ type: "post", url: '/bin/validateRevenueOrder', async: false, data: data, success: function(msg) { if(msg.error == "genericerrorText"){ digitalErrorFunction('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); bootbox.alert('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); } else{ isOrderAllowed = msg.output.validateEmailDomain.isOrderAllowed; message = msg.output.validateEmailDomain.message; } } }); if(isOrderAllowed == "true") { var result; var small_template = Handlebars.compile($("#buyModalBody").html()); document.cookie="mySearchServlet="+window.location+";domain=.maximintegrated.com;path=/"; var servletName = "/bin/SFComponent"; var url = servletName + "?input=single&query=" + encodeURIComponent(part_no); $.ajax({ url: url, dataType: "json", type: 'POST', xhrFields: { withCredentials: true }, success: function(data) { result = data; if(result == "genericerrorText"){ document.cookie="mySearchServlet="+window.location+";domain=.maximintegrated.com;path=/"; digitalErrorFunction('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); bootbox.alert('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); }else if (result != "") { if(result.errors != undefined && result.errors[0].message) { document.cookie="mySearchServlet="+window.location+";domain=.maximintegrated.com;path=/"; digitalErrorFunction('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); bootbox.alert('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); }else { document.cookie="mySearchServlet="+window.location+";domain=.maximintegrated.com;path=/"; var sampleJson = result; var vol = sampleJson.volumePrices; sampleJson.userType = userType; var noPricingMsg = 0; minQty = sampleJson.min; mult = sampleJson.mult; if(vol != undefined && userType != "DISTRIBUTOR" ) { for (var i = 0; i < vol.length; i++) { var j = i + 1; var vol1 = ""; if (j <= vol.length) { if(vol[i].minQuantity < 1000) { stdPricingFlag = 1; if(j == vol.length) { vol1 = vol[i].minQuantity + "+"; } else { vol1 = vol[i].minQuantity + "-" + vol[i].maxQuantity; } } else if(vol[i].minQuantity == 1000) { vol1 = "1000+"; stdPricingFlag = 1; } else { if(i ==0 && vol[i].minQuantity > 1000) { //vol1 = "No standard pricing available"; noPricingMsg++; delete sampleJson.volumePrices[i].formattedValue; } else { delete sampleJson.volumePrices[i]; continue; } } } else if(j == vol.length && j == 1) { vol1 = vol[i].minQuantity + "-" + 24; stdPricingFlag = 1; } sampleJson.volumePrices[i].minQuantity = vol1; } } maxInventory = sampleJson.stock.atpInv; leadTime = sampleJson.leadTime; if (maxInventory == "" || maxInventory == undefined) { maxInventory = 0; } $('#addToCart').html(small_template(sampleJson)); if(userType != "DISTRIBUTOR") { call(quantity); } } } else { document.getElementById('buyParams').innerHTML = "Default"; digitalErrorFunction('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); bootbox.alert('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); } } }); } else { digitalErrorFunction('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); $('#revenuedomainerrordialog').modal('show'); } } else if (buy == "sample") { if(userType == "DISTRIBUTOR" || userType == "EMPLOYEE" ){ window.location.href = "https://shop.maximintegrated.com/backoffice/general/index.php?action=DISTRIBUTOR"; return false; } var isSampleOrderAllowed = "true"; var sampleMessage = ""; var data = "userId="+CQ_Analytics.ProfileDataMgr.getProperty("email"); $.ajax({ type: "post", url: '/bin/validateSampleOrder', async: false, data: data, success: function(msg) { if(msg.error == "genericerrorText"){ digitalErrorFunction('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); bootbox.alert('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); } else if(msg.status == false){ if(msg.message.match("^Your session expired")){ bootbox.confirm('セッションが期限切れです。もう一度ログインしてください。', function(result) { var authorizableId = CQ_Analytics.PersonalInfoStoreMgr.getProperty("authorizableId"); CQ.shared.Util.load("\x2Fbin\x2FLogoutServlet\x3Flanguage\x3Den"+"&authorizableId="+authorizableId); window.location="/jp/mymaxim/login.html"; }); } else { digitalErrorFunction(msg.message); bootbox.alert(msg.message); } }else{ isSampleOrderAllowed = msg.output.validateEmailDomain.isOrderAllowed; sampleMessage = msg.output.validateEmailDomain.message; var itemCount = msg.output.validateEmailDomain.itemCount; var orderCount = msg.output.validateEmailDomain.orderCount; if (localStorage.getItem(part_no) == 1) { mycart_widget("sample", function (status) { if (status && typeof _satellite != "undefined") _satellite.track("cart: add"); }); return false; } else { sampleAddToCart(isSampleOrderAllowed, sampQty, part_no, sampleMessage,itemCount,orderCount); } } } }); } } function sampleAddToCart(isSampleOrderAllowed, sampQty, part_no, sampleMessage,itemCount,orderCount) { if(isSampleOrderAllowed == "true"){ if(typeof orderCount != 'undefined' && parseInt(orderCount) >= 1){ bootbox.alert("マキシムの無料サンプルポリシーは各メンバーのサンプル請求数に制限を設けています。お客様はこの最大数を超えました。このメッセージを誤って受信されたと思われる場合は samples-admin@maximintegrated.com までEメールにてご連絡ください。"); return; } else if(typeof itemCount != 'undefined' && parseInt(itemCount) >= 4){ bootbox.alert("一回のサンプル請求の限度である4ラインを越えました。 ご注文ページで製品検索をして追加製品をご購入ください。"); return; } else{ //var qty = document.getElementById('product-quantity').value; if (sampQty >= 1 || userType == "DISTRIBUTOR" || userType == "EMPLOYEE") { var qty = 1; //taking qty fixed as 5 for sample var data = "input=addtocart&qty=" + qty + "&part_no=" + encodeURIComponent(part_no) + "&CartType=sampleCart&sampleQty="+sampQty+"&usertype="+userType; $.ajax({ type: "post", url: '/bin/cartOperations', async: false, data: data, success: function (msg, textStatus, jqXHR) { if (textStatus == "success") { if (msg == "false") { digitalErrorFunction('最大数量を超えています。操作を続行するためには数量を減らしてください。'); bootbox.alert('最大数量を超えています。操作を続行するためには数量を減らしてください。'); return false; } else if (msg.match("^You") || msg.match("^Product")) { bootbox.confirm('セッションが期限切れです。もう一度ログインしてください。', function (result) { var authorizableId = CQ_Analytics.PersonalInfoStoreMgr.getProperty("authorizableId"); CQ.shared.Util.load("\x2Fbin\x2FLogoutServlet\x3Flanguage\x3Den" + "&authorizableId=" + authorizableId); window.location = "/jp/mymaxim/login.html"; }); } else if (msg.match("^No orderable unit")) { digitalErrorFunction(msg); bootbox.alert(msg); } else { localStorage.setItem(part_no, "1"); mycart_widget("sample", function (status) { if (status && typeof _satellite != "undefined") _satellite.track("cart: add"); }); } } else { digitalErrorFunction('システムエラーが発生しました。カスタマーサポートまでご連絡ください。' + JSON.stringify(msg)); bootbox.alert('システムエラーが発生しました。カスタマーサポートまでご連絡ください。' + JSON.stringify(msg)); } } }); } else { digitalErrorFunction('サンプルに十分の数量がございません。最大サンプル数量:' + sampQty); bootbox.alert('サンプルに十分の数量がございません。最大サンプル数量:' + sampQty); } } } else { if(sampleMessage =='SAMPLEEMAILDENIAL'){ //bootbox.alert(sampleMessage); $('#sampleemaildenialerrordialog').modal('show'); } else{ $('#domainerrordialog').modal('show'); } //bootbox.alert(sampleMessage); } } $(document).on("click", ".useThisBuyQuote", function () { var quantity = ""; quantity = $('#product-quantityBuyQuote').val(); quantity = quantity.trim(); if(quantity.length == 0){ digitalErrorFunction('数量を入力してお進みください'); bootbox.alert('数量を入力してお進みください'); quantity.focus(); return false; } var part_no = $('#Pcode').val(); var quoteId= $(this).data("quote-id"); var quoteItemId = $(this).data("quote-item-id"); $.ajax({ type: "post", url: '/bin/cartOperations', data: "input=addtocart"eId="+quoteId+""eItemNumber="+quoteItemId+"&qty=" + quantity + "&part_no=" + encodeURIComponent(part_no), success: function(msg, textStatus, jqXHR) { if (textStatus == "success") { if(msg.match("^You") || msg.match("^Product")){ if(msg.match("^Your session expired")) { bootbox.confirm('セッションが期限切れです。もう一度ログインしてください。', function(result) { var authorizableId = CQ_Analytics.PersonalInfoStoreMgr.getProperty("authorizableId"); CQ.shared.Util.load("\x2Fbin\x2FLogoutServlet\x3Flanguage\x3Den"+"&authorizableId="+authorizableId); window.location="/jp/mymaxim/login.html"; }); } else { digitalErrorFunction(msg); bootbox.alert(msg); return false; } } else if (msg.match("^No Price found")){ //bootbox.alert(msg); digitalErrorFunction('この製品につきましてはお客様が入力した数量でのお見積もりが必要です。'); bootbox.alert('この製品につきましてはお客様が入力した数量でのお見積もりが必要です。'); return false; } else if(msg.match('この製品につきましてはお客様が入力した数量でのお見積もりが必要です。')){ digitalErrorFunction(msg); bootbox.alert(msg); return false; } else if(msg==""){ digitalErrorFunction('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); bootbox.alert('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); return false; } else if(quoteId != "" && quoteId != undefined && ! msg.match("statusCode=success")) { digitalErrorFunction(msg); bootbox.alert(msg); return false } else { $('#useQuoteModal').modal('hide'); mycart_widget(); if ($("#buyParams").html() == "SavedLater") { //alert("Yes inside"); deleteSavedForLater(part_no); } } } else { digitalErrorFunction('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'+ JSON.stringify(msg)); bootbox.alert('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'+ JSON.stringify(msg)); } } }); }); function call(quantity) { var qty ="",quoteId,quoteItemNumber = ""; if(typeof quantity != "undefined" && quantity !="") { qty=quantity; } else { var value = $('#product-quantity1').val(); if(value != "undefined" && value != "") { qty = value; } else{ qty = document.getElementById('product-quantity').value; } } qty = qty.trim(); var orderInMult = $('#orderInMult').val(); var orderInMin = $('#orderInMin').val(); var inventoryVal = $('#stockAvaliability').val(); var stockAvaliability = $('#stockAvaliability').val(); var cfValue = $('#cfValue').val(); var carrierTypeValue = $('#carrierTypeValue').val(); quoteId=$("#addToCartP").attr('data-quote-id'); quoteItemNumber=$("#addToCartP").attr('data-quote-item-number'); if(quoteId == undefined){ quoteId =""; quoteItemNumber = ""; } if(quoteId != "" && quoteId != undefined){ } else { if(!(cfValue == 'true' && carrierTypeValue == 'Tape')){ if(parseInt(qty) > parseInt(inventoryVal)){ if(qty != "" && orderInMult != "" && orderInMin != "" ){ if(parseInt(qty) < parseInt(orderInMin)){ $('#product-quantity').val(orderInMin); $('#quantity-label').show(); return false; } else if(qty % orderInMult == 0){ $('#quantity-label').hide(); } else { var modvalue = parseInt(qty) % parseInt(orderInMult); var q4 = parseInt(orderInMult)-parseInt(modvalue); var nearestNum = parseInt(qty) + parseInt(q4); //var nearestNum = (Math.round(qty / orderInMult)+1) * orderInMult; $('#product-quantity').val(nearestNum); $('#quantity-label').show(); return false; } } } else if(parseInt(qty) <= parseInt(inventoryVal) && carrierTypeValue == 'Reel'){ if(qty != "" && orderInMult != "" && orderInMin != "" ){ if(parseInt(qty) < parseInt(orderInMin)){ $('#product-quantity').val(orderInMin); $('#quantity-label').show(); return false; } else if(qty % orderInMult == 0){ $('#quantity-label').hide(); } else { var modvalue = parseInt(qty) % parseInt(orderInMult); var q4 = parseInt(orderInMult)-parseInt(modvalue); var nearestNum = parseInt(qty) + parseInt(q4); //var nearestNum = (Math.round(qty / orderInMult)+1) * orderInMult; $('#product-quantity').val(nearestNum); $('#quantity-label').show(); return false; } } } } // Bulk SOT Check if(cfValue == 'true' && carrierTypeValue == 'Tape'){ if(parseInt(stockAvaliability) == 0){ digitalErrorFunction('大変申し訳ございません、在庫切れの為ご要望にお応えすることができません。このパッケージタイプはテストとテープ&リール一体型のテスターを使用している為、最終テスト完了時にリールサイズに満たない端数ロットが生じた場合にのみテープカット品として販売しております。現在はこの端数ロット在庫が売り切れの状態です。ご注文をテープ&リール品番(末尾が+Tまたは+T&R)へ切り替えてのご購入を検討いただくか、またはマキシム製品販売代理店に少数購入が可能かお問合せお願いいたします。'); bootbox.alert('大変申し訳ございません、在庫切れの為ご要望にお応えすることができません。このパッケージタイプはテストとテープ&リール一体型のテスターを使用している為、最終テスト完了時にリールサイズに満たない端数ロットが生じた場合にのみテープカット品として販売しております。現在はこの端数ロット在庫が売り切れの状態です。ご注文をテープ&リール品番(末尾が+Tまたは+T&R)へ切り替えてのご購入を検討いただくか、またはマキシム製品販売代理店に少数購入が可能かお問合せお願いいたします。'); return false; } } } var part_no = document.getElementById('Pcode').value; if(qty.length == 0){ digitalErrorFunction('数量を入力してお進みください'); bootbox.alert('数量を入力してお進みください'); qty.focus(); return false; } if (qty % 1 != 0) { digitalErrorFunction('少数や負の数は使用しないでください(正の整数のみ)'); bootbox.alert('少数や負の数は使用しないでください(正の整数のみ)'); return false; } var userId = CQ_Analytics.ProfileDataMgr.getProperty("email"); if(CQ_Analytics.PersonalInfoStoreMgr.getProperty("isLoggedIn", true) || CQ_Analytics.PersonalInfoStoreMgr.getProperty("isLoggedIn", true) == "true") { var userType = encodeURI(CQ_Analytics.PersonalInfoStoreMgr.getProperty("userType")); if(typeof quantity != "undefined") { $.removeCookie("redirect"); $.removeCookie("part_no"); $.removeCookie("sampQty"); $.removeCookie("quantity"); $.removeCookie("buy"); } var message = ""; var data = "userId="+userId; var isOrderAllowed="true"; $.ajax({ type: "post", url: '/bin/validateRevenueOrder', async: false, data: data, success: function(msg) { if(msg.error == "genericerrorText"){ digitalErrorFunction('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); bootbox.alert('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); } else{ isOrderAllowed = msg.output.validateEmailDomain.isOrderAllowed; message = msg.output.validateEmailDomain.message; } } }); if(isOrderAllowed == "true") { $.ajax({ type: "post", url: '/bin/cartOperations', data: "input=addtocart"eId="+quoteId+""eItemNumber="+quoteItemNumber+"&qty=" + qty + "&part_no=" + encodeURIComponent(part_no), success: function(msg, textStatus, jqXHR) { if (textStatus == "success") { if(msg.match("^You") || msg.match("^Product")){ if(msg.match("^Your session expired")) { bootbox.confirm('セッションが期限切れです。もう一度ログインしてください。', function(result) { var authorizableId = CQ_Analytics.PersonalInfoStoreMgr.getProperty("authorizableId"); CQ.shared.Util.load("\x2Fbin\x2FLogoutServlet\x3Flanguage\x3Den"+"&authorizableId="+authorizableId); //window.location="/jp/storefront.html"; window.location="/jp/mymaxim/login.html"; }); } else { digitalErrorFunction(msg); bootbox.alert(msg); return false; } } else if (msg.match("^No Price found")){ //bootbox.alert(msg); digitalErrorFunction('この製品につきましてはお客様が入力した数量でのお見積もりが必要です。'); bootbox.alert('この製品につきましてはお客様が入力した数量でのお見積もりが必要です。'); return false; }else if(msg.match('この製品につきましてはお客様が入力した数量でのお見積もりが必要です。')){ digitalErrorFunction(msg); bootbox.alert(msg); return false; }else if(msg.match("^zeroInventoryErrorMsg")){ digitalErrorFunction('大変申し訳ございません、在庫切れの為ご要望にお応えすることができません。このパッケージタイプはテストとテープ&リール一体型のテスターを使用している為、最終テスト完了時にリールサイズに満たない端数ロットが生じた場合にのみテープカット品として販売しております。現在はこの端数ロット在庫が売り切れの状態です。ご注文をテープ&リール品番(末尾が+Tまたは+T&R)へ切り替えてのご購入を検討いただくか、またはマキシム製品販売代理店に少数購入が可能かお問合せお願いいたします。'); bootbox.alert('大変申し訳ございません、在庫切れの為ご要望にお応えすることができません。このパッケージタイプはテストとテープ&リール一体型のテスターを使用している為、最終テスト完了時にリールサイズに満たない端数ロットが生じた場合にのみテープカット品として販売しております。現在はこの端数ロット在庫が売り切れの状態です。ご注文をテープ&リール品番(末尾が+Tまたは+T&R)へ切り替えてのご購入を検討いただくか、またはマキシム製品販売代理店に少数購入が可能かお問合せお願いいたします。'); }else if(msg==""){ digitalErrorFunction('System error occured. Contact customer support for assistance.'); bootbox.alert('System error occured. Contact customer support for assistance.'); return false; } else if(quoteId != "" && quoteId != undefined && ! msg.match("statusCode=success")) { digitalErrorFunction(msg); var msgMatch = msg.match("^Quote compliance not met for quote number (.[0-9]*) as compliance is (.[0-9]%)$"); if(msgMatch){ bootbox.alert('Quote compliance not met for quote number '+ msgMatch[1] + ' as compliance is ' + msgMatch[2]); }else { bootbox.alert(msg); } return false } else if(msg.match('To order this part, you must order the entire inventory of')){ bootbox.alert(msg); return false; } else if(msg.match('We are sorry! Unfortunately, there is not enough excess inventory to support this bulk SOT part request')){ bootbox.alert(msg); return false; } else if(msg.match('A valid quote is required to purchase this part')){ bootbox.alert(msg); return false; }else { $('#addToCartP').modal('hide'); mycart_widget("", function(status){ if(status && typeof _satellite != "undefined") _satellite.track("cart: add"); if(msg.match("entryNumber=1") && typeof _satellite != "undefined"){ _satellite.track("cart: open"); } }); if(quoteId != null && quoteId != "" && quoteId != undefined && msg.match("statusCode=success")){ window.digitalQuoteData = { quoteID : quoteId, quoteQuantity : qty, partNo : encodeURIComponent(part_no) } if(typeof _satellite != "undefined"){ _satellite.track("use-quote"); } } if ($("#buyParams").html() == "SavedLater") { //alert("Yes inside"); deleteSavedForLater(part_no); } } } else { digitalErrorFunction('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'+ JSON.stringify(msg)); bootbox.alert('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'+ JSON.stringify(msg)); } } }); } else { digitalErrorFunction('システムエラーが発生しました。カスタマーサポートまでご連絡ください。'); $('#revenuedomainerrordialog').modal('show'); } }else{ $.cookie("quantity",qty); $("#addToCartP").modal("hide"); gigya.accounts.showScreenSet(aem.login.params); } } function redirectBulkOrder(partNumber,quantity){ var url="/jp/storefront/bulk-order.html"; if(typeof partNumber != "undefined" && partNumber != "") { url+="?partNumber="+partNumber; } if(typeof quantity != "undefined" && quantity != "") { url+="&quantity="+quantity; } window.location.href = url; } function redirectToModelN(){ window.open("https://maxim.modeln.com/", '_blank',"width=400,height=150").focus(); } $(document).on('click', '.quoteDetails', function() { $("#useQuoteModal .modal-body").html(""); var index = ""; var quoteNo = ""; var part = $(this).data("part-no"); if(part == "" || part == "undefined") { digitalErrorFunction('有効な型番をご入力ください'); bootbox.alert('有効な型番をご入力ください'); return false; } if(quoteNo != "" && quoteNo != "undefined") { getQuotesList(part, index, quoteNo); } else { getQuotesList(part, index, quoteNo); digitalErrorFunction('有効なお見積もり番号をご入力ください'); //bootbox.alert('有効なお見積もり番号をご入力ください'); //return false; } }); var useQuoteModalTemplate = $("#useQuoteModalBody").html(); function getQuotesList(part, index, quoteId) { var userType = CQ_Analytics.PersonalInfoStoreMgr.getProperty("userType"); var oldPart = $("#partHidden"+index).val(); //oldpart == part to handle unnecessary quotelists api calls for same part. if(part == "" || part == undefined || part.length < 5 || oldPart == part) { return false; } if(userType == "" || userType == undefined){ $("#modelBuyCartButton").trigger("click"); gigya.accounts.showScreenSet(aem.login.params); return false; } var queryString = "quoteId="+quoteId+"&pendingStatus=&summery=disti&quantity=&materialNumber="+encodeURIComponent(part); var materialNumber = part; var activeFlag = 0; $.ajax({ url:"/bin/QuoteMangementServlet", type: 'GET', data: queryString, success:function(data){ //alert(JSON.stringify(data)); var useQuoteTemplate = Handlebars.compile(useQuoteModalTemplate); var useQuoteJson = {quotesList : [], code : materialNumber, index : index}; if(data.status == false) { var useQuoteJson = {quotesList : [], code : materialNumber, index : index, errorMessage : data.error.errorList.errors.message }; $("#modelBuyCartButton").trigger("click"); $("#quoteLineFlag"+index).val("false"); $('#useQuoteModal').html(useQuoteTemplate(useQuoteJson)); $('#useQuoteModal').modal('show'); digitalErrorFunction(data.error.errorList.errors.message); return false; } else { var quoteListJson = data.quoteList.quotes.quote; } if($.type(data.quoteList.quotes.quote) != "array") { if($.type(quoteListJson.quote_items) != "array") { if(quoteListJson.quote_items.product.code == materialNumber) { var quoteId = quoteListJson.ecom_qt_id_h; var quantity = quoteListJson.quote_items.quantity; //var price = findPriceByQuantity(quoteListJson.quote_items.product.volumePrices, quoteListJson.quote_items.quantity); price = (quoteListJson.quote_items.requote_price * 1).toFixed(3); if(userType == "DISTRIBUTOR") { price = (quoteListJson.quote_items.adj_disti_cost * 1).toFixed(3); quoteId = quoteListJson.modelNQuoteNumber; } var total = price * quantity; total =total.toFixed(3); if(quoteListJson.quote_items.quoteItemStatus == "ACTIVE" && quantity != "" && quantity != "undefined"){ activeFlag = 1; useQuoteJson.quotesList.push({"totalCost":total, "quoteItemId" : quoteListJson.quote_items.code, "status" : quoteListJson.quote_items.quoteItemStatus, "quantity":quantity, "entryNumber":quoteListJson.quote_items.item_num,"quoteId": quoteId, "price": price, "orderCompilance": quoteListJson.quote_items.ordcompliance}); } } else { //return useQuoteJson; //break; } } else { for(var i =0; i